天天看點

sed 修改檔案

正确的修改進檔案指令(替換檔案内容):

sed -i "s#machangwei#mcw#g" mcw.txt

正确的修改追加進檔案指令(追加檔案内容):

sed -i "\$a 8: wo bu hao\!" mcw.txt

sed -i '$a 7: wo hen hao!' mcw.txt

最後一行$a追加内容,加上-i修改到檔案;單引号無需轉義,雙引号需要注意特殊字元轉義

隻有-i和替換,沒有-n和列印,才是我們經常需要的替換。将檔案内容替換并寫入到檔案了

第幾行上面插入字元串,但是并不修改原檔案,加上-i也不行,使用單雙引号也不行

比對指定行上面插入或追加字元串,會報錯,加上-i不行,不加還是不行,

替換檔案存在的坑

隻有-i和替換,沒有-n和列印,才是我們經常需要的替換。将檔案内容替換并寫入到檔案了。不能添加-n和列印做sed替換

首先建立一個測試檔案

[machangwei@mxxx01 ~/mcw]$ mkdir mcw03

[machangwei@mxxx01 ~/mcw]$ cd mcw03/

[machangwei@mxxx01 ~/mcw/mcw03]$ vim mcw.txt

[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt

1: ni hao ya

2:

3: wo shi machangwei

4: 22bc

5: fff abc

6: abc

[machangwei@mxxx01 ~/mcw/mcw03]$ cp mcw.txt mcw.txt.bak

[machangwei@mxxx01 ~/mcw/mcw03]$ ls

mcw.txt mcw.txt.bak

-n卻沒有列印,不顯示替換結果也不改變檔案

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -n "s#machangwei#mcw#g" mcw.txt

-n沒有列印,就是空内容,加上-i就把空内容加到檔案裡了。檔案就空了,内容被删除。sed操作前最好先備份

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -ni "s#machangwei#mcw#g" mcw.txt

[machangwei@mxxx01 ~/mcw/mcw03]$

[machangwei@mxxx01 ~/mcw/mcw03]$ cp mcw.txt.bak mcw.txt

-n且列印,就顯示替換後的那一行,

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -n "s#machangwei#mcw#gp" mcw.txt

3: wo shi mcw

沒有-n,替換然後列印。替換的行是重複列印

[machangwei@mxxx01 ~/mcw/mcw03]$ sed "s#machangwei#mcw#gp" mcw.txt

-n加列印p,隻顯示替換的行,并且顯示是替換後的結果

-n加列印p,本來就顯示替換後的行,加個-i修改檔案,那麼把顯示的替換都的行寫入檔案,相當于重寫檔案或者說把顯示結果覆寫到原檔案

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -ni "s#machangwei#mcw#gp" mcw.txt

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -n "s#machangwei#mgp" mcw.txt

sed:-e 表達式 #1,字元 16:未終止的“s”指令

[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt.bak

-i插入,後面還有個p列印,會将替換掉的行重複寫入到檔案

[machangwei@mxxx01 ~/mcw/mcw03]$ vim mcw.txt.bak

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i "s#machangwei#mcw#gp" mcw.txt

[machangwei@mxxx01 ~/mcw/mcw03]$ cp mcw.txt.bak mcw.txt

隻有-i和替換,沒有-n和列印,才是我們經常需要的替換。将檔案内容替換并寫入到檔案 了

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i "s#machangwei#mcw#g" mcw.txt

[machangwei@mxxx01 ~/mcw/mcw03]$ #上面是替換中存在的坑

準備檔案

[machangwei@mxxx01 ~/mcw/mcw03]$ #下面是插入和追加到檔案

最後一行追加内容,不加-i會顯示追加後的内容,但是不修改檔案。這裡是單引号

[machangwei@mxxx01 ~/mcw/mcw03]$ sed '$a 7: wo hen hao!' mcw.txt

7: wo hen hao!

最後一行追加内容,加上-i修改到檔案。這裡單引号

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i '$a 7: wo hen hao!' mcw.txt

[machangwei@mxxx01 ~/mcw/mcw03]$ sed "\$a 8: wo bu hao!" mcw.txt

-bash: !": event not found

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i '$a 7: wo hen hao\!' mcw.txt

雙引号最後一行追加,需要将裡面的特殊字元串轉義 。不加-i不修改檔案

[machangwei@mxxx01 ~/mcw/mcw03]$ sed "\$a 8: wo bu hao\!" mcw.txt

8: wo bu hao!

[machangwei@mxxx01 ~/mcw/mcw03]$ #雙引号裡特殊字元會被解析,是以要轉義

雙引号最後一行追加,需要将裡面的特殊字元串轉義 。加-i修改了原檔案

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i "\$a 8: wo bu hao\!" mcw.txt

[machangwei@mxxx01 ~/mcw/mcw03]$ sed "$d" mcw.txt

第幾行插入字元串,但是并不修改原檔案

[machangwei@mxxx01 ~/mcw/mcw03]$ sed '7i 小馬過河' mcw.txt

小馬過河

第幾行插入字元串,但是并不修改原檔案,加上-i也不行

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i '7i 小馬過河' mcw.txt

-i 小馬過河

-i i 過河

第幾行上面插入字元串,但是并不修改原檔案,加上-i也不行使用雙引号也不行

[machangwei@mxxx01 ~/mcw/mcw03]$ sed "7i 小馬過河" mcw.txt

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i "7i 小馬過河" mcw.txt

-i 小馬過河

比對指定行上面插入字元串,但是并不修改原檔案,加上-i也不行,使用雙引号也不行,

[machangwei@mxxx01 ~/mcw/mcw03]$ sed "/wo he/i 小馬過河" mcw.txt

-i/wo he/i馬過河

[machangwei@mxxx01 ~/mcw/mcw03sed '/wo he/i 小馬過河' mcw.txt

[machangwei@mxxx01 ~/mcw/mcw03]$ sed '/wo he/i 小馬過河' mcw.txt

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i '/wo he/i 小馬過河' mcw.txt

> ^C

[machangwei@mxxx01 ~/mcw/mcw03]$ sed '/abc/a 小馬過河' mcw.txt

[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i '/abc/a 小馬過河' mcw.txt

參考連結:https://www.cnblogs.com/ggzhangxiaochao/p/13131424.html