sed命令整體可以幹嘛
總體而言,sed命令可以對文本進行查找、刪除、插入、替換等操作。它跟vim或者vi命令最大的去區別是,後者只能通過人工交互的方式,對文本進行處理。而很多時候,我們希望腳本自動化的進行文本處理,那麼sed無疑是我們的好幫手
命令簡介sed OPTIONS [SCRIPT] [INPUTFILE...]
OPTIONS 用於指定對處理後的文本的一些輸出行為,比如-i,-n,後續會詳解
SCRIPT 定義實際的處理行為,比如想要查詢什麼、刪除什麼、插入什麼
INPUTFILE 這是具體要被處理的文本。文本還可以來自於管道符,於是命令格式形如下
echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g'
樣例文本說明為了方便對命令處理效果的說明,首先我們準備一個文本sed_learn.txt,其內容如下
unix is great os. unix is opensource. unix is free os.
learn operating system.
unix linux which one you choose.
在script中,以p做為查找輸出命令,意即print
查找指定行數的內容並列印列印1到2行的文本
sed -n '1,2 p' sed_learn.txt
輸出結果
unix is great os. unix is opensource. unix is free os.
learn operating system.
上述搜索列印使用到了參數-n,詳細講解見後面
查找指定關鍵字所在的行,並列印列印包含unix關鍵字的行sed -n '/unix/p' sed_learn.txt,輸出結果如下
unix is great os. unix is opensource. unix is free os.
unix linux which one you choose.
其中兩斜槓/unix/ 中間,除了可以指定關鍵字,還可以指定正則表達式
插入插入空行使用G表示插入空行
在每行後面插入空行
sed 'G' sed_learn.txt
結果如下
unix is great os. unix is opensource. unix is free os.
learn operating system.
unix linux which one you choose.
在每行後插入兩個空行 sed 'G;G' sed_learn.txt 結果如下為
unix is great os. unix is opensource. unix is free os.
learn operating system.
unix linux which one you choose.
```
在包含指定關鍵字的行後面插入新行 :sed '/love/G' sed_learn.txt表示在包含love的行後面插入新行
在指定位置插入空格:sed 's/^/ /' a.txt 表示在所有行前,插入5個空格,^表示行首
刪除在script中指定d命令,表示對文本進行相關的刪除動作
刪除指定行比如sed '1d' sed_learn.txt表示刪除第一行
刪除指定範圍的行sed '1,2d' sed_learn.txt //表示刪除1到2行
sed '1,$d' sed_learn.txt //表示刪除1到最後一行
刪除最後一行sed '$d' sed_learn.txt
搜索指定的位置的行sed '/unix/d' sed_learn.txt //表示刪除所有包含unix的行
刪除所有空行sed '/^$/d' sed_learn.txt
替換替換命令的腳本格式一般為sed line_number1,line_number2 's/search_keyword_or_regular_express/string_for_replace/search_range_for_one_line'
search_keyword_or_regular_express 指定在一行中匹配的關鍵字或正則表達式
string_for_replace:指定匹配到後,替換的字符。
search_range_for_one_line:指定在一行中,搜索匹配的範圍。默認只對一行中第一次匹配到的內容進行替換
line_number1,line_number2 前面都是對具體某一行的匹配替換行為進行指定,這裡指定具體要對哪些行進行匹配替換
例如:sed '1,3 s/unix/linux/' sed_learn.txt 表示,將1到3行中的第一次匹配到unix的地方,替換成linux
例如:sed '1,3 s/unix/linux/g' sed_learn.txt 表示,將1到3行中的所有匹配到unix的地方,替換成linux
給文本編號給所有行編號:sed = sed_learn.txt | sed 'N;s/\n/\t/' , 其中等號=是給文本每行前面插入一個帶數字的行,由於換行了,所以管道符後面將換行符\n變成了制表符\t。當然我們可以直接換成空格sed = sed_learn.txt | sed 'N;s/\n/ /
給非空行編號:sed '/./=' a.txt | sed '/./N; s/\n/ /',通過/./匹配到所有非空的行,然後使用=編號。最後,再將換行符\n替換成空格
多命令模式在script中,可以指定多組命令,用分號隔開就行
比如sed 'G' sed_learn.txt,表示插入一個空行 而sed 'G;G' sed_learn.txt 表示插入兩個空行
一些option參數就地修改-i前面講的所有查詢、刪除、替換,都是直接將處理結果輸出到終端,為了保留這些處理結果,我們可以使用重定向到某個文件進行保存,比如sed '/unix/d' sed_learn.txt > result.txt。但我們也可以通過指定-i 參數,直接將修改後的結果,更新到原文件,這裡的-i代表in place即為就地的意思
例如sed -i '1,$ s/unix/linux/g' sed_learn.txt 會將sed_learn.txt的內容,直接更新為如下
linux is great os. linux is opensource. linux is free os.
learn operating system.
linux linux which one you choose.
默認情況下,p指令會將所有文本列印出來,並將匹配到文本進行重複列印。比如執行sed '1,2 p' sed_learn.txt, 其結果如下,
unix is great os. unix is opensource. unix is free os.
unix is great os. unix is opensource. unix is free os.
learn operating system.
learn operating system.
unix linux which one you choose.
可以看到,它不光把第三行的內容也輸出了,還把1,2行進行了重複列印。而-n則可以只列印匹配到的內容,且不重複
總結基本上,sed命令,都是先定位到某行,或某行的某個位置,然後進行相應的處理。除此之外,還需要指定具體要對那些行進行前述處理
參考資料https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/
https://www.geeksforgeeks.org/sed-command-linux-set-2/