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不行,不加還是不行,

替換文件存在的坑

sed -i "s#machangwei#mcw#g" mcw.txt
只有-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
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi machangwei
4: 22bc
5: fff abc
6: abc

-n沒有打印,就是空內容,加上-i就把空內容加到文件里了。文件就空了,內容被刪除。sed操作前最好先備份
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -ni "s#machangwei#mcw#g" mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$
[machangwei@mxxx01 ~/mcw/mcw03]$ cp mcw.txt.bak mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -ni "s#machangwei#mcw#g" mcw.txt
[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
1: ni hao ya
2:
3: wo shi mcw
3: wo shi mcw
4: 22bc
5: fff abc
6: abc

-n加打印p,只顯示替換的行,並且顯示是替換后的結果
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -n "s#machangwei#mcw#gp" mcw.txt
3: wo shi mcw

-n加打印p,本來就顯示替換后的行,加個-i修改文件,那么把顯示的替換都的行寫入文件,相當於重寫文件或者說把顯示結果覆蓋到原文件
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -ni "s#machangwei#mcw#gp" mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
3: wo shi mcw
[machangwei@mxxx01 ~/mcw/mcw03]$ cp mcw.txt mcw.txt.bak
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -n "s#machangwei#mgp" mcw.txt
sed:-e 表達式 #1,字符 16:未終止的“s”命令
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -n "s#machangwei#mcw#gp" mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
3: wo shi mcw
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt.bak
3: wo shi mcw


-i插入,后面還有個p打印,會將替換掉的行重復寫入到文件
[machangwei@mxxx01 ~/mcw/mcw03]$ vim mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ vim mcw.txt.bak
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -n "s#machangwei#mcw#gp" mcw.txt
3: wo shi mcw
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i "s#machangwei#mcw#gp" mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
3: wo shi mcw
4: 22bc
5: fff abc
6: abc

 

[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt.bak
1: ni hao ya
2:
3: wo shi machangwei
4: 22bc
5: fff abc
6: abc
[machangwei@mxxx01 ~/mcw/mcw03]$ cp mcw.txt.bak mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i "s#machangwei#mcw#gp" mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
3: wo shi mcw
4: 22bc
5: fff abc
6: abc

只有-i和替換,沒有-n和打印,才是我們經常需要的替換。將文件內容替換並寫入到文件 了
[machangwei@mxxx01 ~/mcw/mcw03]$ cp mcw.txt.bak mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i "s#machangwei#mcw#g" mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
[machangwei@mxxx01 ~/mcw/mcw03]$
[machangwei@mxxx01 ~/mcw/mcw03]$ #上面是替換中存在的坑


追加到文件最后一行實操

准備文件
[machangwei@mxxx01 ~/mcw/mcw03]$ #下面是插入和追加到文件
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc

最后一行追加內容,不加-i會顯示追加后的內容,但是不修改文件。這里是單引號
[machangwei@mxxx01 ~/mcw/mcw03]$ sed '$a 7: wo hen hao!' mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc

最后一行追加內容,加上-i修改到文件。這里單引號
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i '$a 7: wo hen hao!' mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!


[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
[machangwei@mxxx01 ~/mcw/mcw03]$ vim mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$


雙引號最后一行追加,需要將里面的特殊字符串轉義 。不加-i不修改文件
[machangwei@mxxx01 ~/mcw/mcw03]$ sed "\$a 8: wo bu hao\!" mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ #雙引號里特殊字符會被解析,所以要轉義
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!

雙引號最后一行追加,需要將里面的特殊字符串轉義 。加-i修改了原文件
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i "\$a 8: wo bu hao\!" mcw.txt
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ sed "$d" mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
8: wo bu hao!


第幾行插入字符串,但是並不修改原文件
[machangwei@mxxx01 ~/mcw/mcw03]$ sed '7i 小馬過河' mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
小馬過河
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
8: wo bu hao!

第幾行插入字符串,但是並不修改原文件,加上-i也不行
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i '7i 小馬過河' mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
-i 小馬過河
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ sed '7i 小馬過河' mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
-i i 過河
7: wo hen hao!
8: wo bu hao!

第幾行上面插入字符串,但是並不修改原文件,加上-i也不行使用雙引號也不行
[machangwei@mxxx01 ~/mcw/mcw03]$ sed "7i 小馬過河" mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
小馬過河
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i "7i 小馬過河" mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
-i 小馬過河
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
8: wo bu hao!

匹配指定行上面插入字符串,但是並不修改原文件,加上-i也不行,使用雙引號也不行,
[machangwei@mxxx01 ~/mcw/mcw03]$ sed "/wo he/i 小馬過河" mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
-i/wo he/i馬過河
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03sed '/wo he/i 小馬過河' mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
小馬過河
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$
[machangwei@mxxx01 ~/mcw/mcw03]$ sed '/wo he/i 小馬過河' mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
小馬過河
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
8: wo bu hao!


匹配指定行上面插入或追加字符串,會報錯,加上-i不行,不加還是不行,
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i '/wo he/i 小馬過河' mcw.txt
> ^C
[machangwei@mxxx01 ~/mcw/mcw03]$ sed '/abc/a 小馬過河' mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
小馬過河
6: abc
小馬過河
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ sed -i '/abc/a 小馬過河' mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
8: wo bu hao!
[machangwei@mxxx01 ~/mcw/mcw03]$ cat mcw.txt
1: ni hao ya
2:
3: wo shi mcw
4: 22bc
5: fff abc
6: abc
7: wo hen hao!
8: wo bu hao!

 

 

參考鏈接:https://www.cnblogs.com/ggzhangxiaochao/p/13131424.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM