sed命令基本用法
sed是一個非交互式文本編輯器,它可以對文本文件和標准輸入進行編輯,標准輸入可以是來自鍵盤輸入、文件重定向、字符串、變量、來自管道的文本等等。
sed從文本的一個文本行或標准輸入中讀取數據,將其復制到緩存區,然后讀取命令行或腳本的第一個命令,對此命令要求的行號進行編輯,重復此過程,直到命令行或腳本中所有命令都執行完了。sed可以一次性處理所有的編輯命令,非常高效
sed適用於下面三種場合:
* 編輯相對於交互式文本編輯器而言太大的場合
* 編輯命令太復雜,在交互式文本編輯器中難以輸入的情況
* 對文件掃描一遍,但是需要執行多個編輯函數的情況
sed只是對緩存區中原始文件的副本進行編輯,並不編輯原始文件。因此,如果需要保存更改內容,需要將輸出重定向到另一個文件,可以使用下面的命令:
sed 'sed命令' input_file > result_file
或者還有另一種方法就是 -w 選項,這個后面講到
有三種方式調用sed:
① 直接在shell命令行上調用
# sed [選項] 'sed命令' 輸入文件
② 將sed命令插入腳本文件后,通過sed命令調用腳本:
# sed [選項] -f sed腳本文件名 輸入文件
③ 將sed命令寫入腳本文件后,將其+x變成可執行
./sed腳本文件 輸入文件
第三種方式需要在文件頭部加上 #!/bin/sed
sed命令的常用選項:
-n 不打印所有行到標准輸出
-e 表示將下一個字符串解析為sed編輯命令,如果只傳遞一個編輯命令,-e可以省略
-f 表示正在調用sed腳本文件
sed命令通常由定位文本行和sed編輯命令兩部分組成,sed編輯命令對定位到的行進行各種編輯處理
sed提供兩種方式定位文本行:
* 使用行號,指定一行或者行號范圍
* 使用正則表達式
sed命令定位文本行的方法:
| 選項 | 意義 |
| x | x為指定行號 |
| x,y | 指定從x到y的行號范圍 |
| /pattern/ | 查詢包含模式的行 |
| /pattern/pattern/ | 查詢包含兩個模式的行 |
| /pattern/,x | 從與pattern的匹配行到x號行之間的行 |
| x,/pattern/ | 從x號行到與pattern的匹配行之間的行 |
| x,y! | 查詢不包含x和y行號的行 |
===================================分割線=======================
sed編輯命令表
| 選項 | 意義 |
| p | 打印匹配行 |
| = | 打印匹配行號 |
| a\ | 在定位行之后追加文本信息 |
| i\ | 在定位行之前插入文本信息 |
| d | 刪除定位行 |
| c\ | 用新文本替換定位行 |
| s | 使用替換模式替換相應的模式 |
| r | 從另一個文件中讀文本 |
| w | 將文本寫入到另一個文件中 |
| y | 變換字符 |
| q | 第一個模式匹配完成后退出 |
| l | 顯示與八進制ASCII碼等價的控制字符 |
| {} | 在定位行執行的命令組 |
| n | 讀取下一個輸入行,用下一個命令處理新的行 |
| h | 將模式緩存區的文本復制到保持緩存區 |
| H | 將模式緩存區的文本追加到保持緩存區 |
| x | 互換模式緩存區和保持緩存區的內容 |
| g | 將保持緩存區的內容復制到模式緩存區 |
| G | 將保持緩存區的內容追加到模式緩存區 |
========================分割線============================
各個選項和編輯命令詳解:
1,sed命令的-n選項和p命令
# sed -n '1p' input
# sed '1p' input
從輸出可以看出,加了-n后標准輸出上只有第一行打印出來了,而不加-n時候,先打印第一行,然后打印整個文件內容。所以-n選項的意義是:不打印sed編輯內容也就是input的全部內容。只打印匹配的行
# sed -n '3,6p' input --> 打印從3到6行
# sed -n '/certificate/p' input --> 打印匹配模式行,注意大小寫是敏感的
2,sed命令的-e選項
由於sed不支持同時帶多個編輯命令的用法,因此需要用-e選項指定每個編輯命令
# sed -n -e '/Certificate/p' -e '/Certificate/=' input
3,sed命令的-f選項
-f選項只有調用sed腳本文件時才起作用,追加文本、插入文本、修改文本、刪除文本和替換文本等功能往往需要幾條sed命令才能完成,所以,往往將這些命令寫入sed腳本,然后調用sed腳本來完成。
下面是這個sed的腳本:
Sed代碼 1. #!/bin/sed -f
2. /file:/a\
3. We append a new line.\
4. We append another line.
注:上面的/file:/a\中的\表示在換新行后添加內容,而下面內容中的\也表示換行。
4.2.2 sed文本定位的一組例子
1. 匹配元字符
如果目標字符串中包含元字符,需要使用轉義符\屏蔽其特殊意義。
# sed -n '/\./p' input --> 打印含有.的行
2. 使用元字符進行匹配
sed可以靈活使用正則表達式的元字符進行匹配,不過注意的是:$在正則表達式中表示行尾,但是在sed命令中卻表示最后一行,而寫在//中間的$就表示行尾了,哈哈。
# sed -n '$p' input --> 打印最后一行
# sed -n '/^$/p' input -> 打印空行
3. !符號
!表示取反,也就是不滿足條件的時候就處理
# sed -n '/.*this/!p' input --> 打印不包含this的行
# sed -n '3,6!p' input --> 打印不在3至6行間的行
4.2.3 sed基本編輯命令的一組例子
1. 插入文本
插入文本和追加文本類似,區別僅僅是追加文本是在匹配行的后面插入,而插入文本是在匹配行的前面插入
sed插入文本符號位i\,插入文本的格式為:
sed '指定地址 i\text' 輸入文件
新建名為insert.sed的腳本,內容如下:
Bash代碼 1. #!/bin/sed -f
2. # this is comment
3. # date : 2013/06/02
4. # author : xiongneng
5. /this is/i\
6. We insert a new line #插入的文本內容
2. 修改文本
修改文本是指將所匹配的問本行用新文本代替,也就是只能整行替換,sed修改文本符號位c\
sed '指定行 c\text' 輸入文件
3. 刪除文本
sed刪除文本命令可以將指定行或指定行范圍進行刪除,sed的刪除文本符號為d
sed '指定行 d' 輸入文件
4.替換文本
sed替換文本將所匹配的文本行中找到的字符串用新的字符串去代替,常用。而上面的修改文本只能整行,sed替換文本符號為s
sed -n 's/被替換的字符串/新的字符串/p' --> 只替換每行中第一次找到的
sed -n 's/被替換的字符串/新的字符串/gp' --> 替換每行中所有找到的
sed -n 's/被替換的字符串/新的字符串/np' --> 替換每行中第n次找到的
sed替換文本中有個重要的符號&,它表示保存被替換的字符串以供調用。
比如下面兩條命令等級:(都是將this字符串用括號括起來)
# sed -n 's/this/(&)/gp' input
# sed -n 's/this/(this)/gp' input
5. 寫入到一個新文件
上面提到的都是對緩存區中輸入文件的復制內容進行編輯,如果要保存編輯結果,需要將編輯后的文本重定向到另一個文件,sed寫入文件符號為w,基本格式為:
# sed -n '1,5 w output' input
# sed -n '/this/2 output' input
# sed -n 's/this/(&)/gw output' input --> 將this加上括號后,匹配行寫入到output中去
注:這里寫到新文件中的只有匹配的行修改后的數據,如果要整個文件內容都寫進去,使用重定向>> 或者>
6. 從文件中讀入文本內容
sed命令還可以將其他文件中的內容讀入,並附加在指定地址后,sed讀入文件的符號為r
# sed '/this/r otherfile' input
7. 退出命令
sed命令的q選項表示完成指定地址匹配后立即退出
# sed -n '/this/p' input --> 打印出匹配的全部字符串
# sed -n -e '/this/p' -e '/this/q' test.txt --> 找到第一個匹配的打印后就立即退出
8. 變換命令
sed命令的y選項表示字符變換,它將一系列的字符變換為相應的字符,逐個處理的
# sed 'y/被變換的字符序列/變換的字符序列/' 輸入文件
# sed 'y/12345/ABCDE' input --> 將input中1變成A,2變成B,3變成C,4變成D,5變成E
9. 顯示控制字符
sed 1命令可以顯示出文件中的控制字符,比如退格鍵、F1鍵、Shift鍵等
# sed -n '1,$1' input
10. 在定位行執行命令組
sed編輯命令中的{}可以指定在定位行上所執行的命令組,它的作用與sed的-e選項類似,都是為了在定位行執行多個編輯命令。
下面的命令等價:
# sed -n -e '/this/p' -e '/this/q' test.txt
# sed -n '/this/{p;q}' test.txt -->顯然這個更NB點
4.2.4 sed高級編輯命令的一組例子
1. 處理匹配行的下一行
sed編輯命令n的意義是讀取下一個輸入行,用n后面的一個命令處理該行,由於此時通常有個多個編輯命令,所以命令n需要與{}配合使用
# sed '/this is/{n;s/her/him/;}' input --> 找到this is關鍵詞那行,然后將它下一行的her替換成him
2. sed緩存區的處理
前面提到的所有編輯命令都是將輸入文件復制到緩存區,對緩存區的復制內容進行處理。實際上,sed有兩個緩存區,模式緩存區 Pattern Buffer 和保持緩存區 Hold Buffer。前面都是Pattern Buffer,而保持緩存區是另一個內存空間,sed的一些編輯命令可以對保持緩存區進行處理,並與模式緩存區的內容互換
# sed h、x、G命令的用法
# sed '/subject/h; /object/x; $G' input
解釋下:
第一個h命令是將模式緩存區內容復制到保持緩存區,也就是說當找到subject的行的時候,就將該行復制到Hold Buffer,如果該行有object關鍵詞就將模式緩存區和保持緩存內容互換后輸出模式緩存區內容,第三條命令表示如果是到了最后一行,就直接輸出保持 緩存區內容。
h和H、g和G是兩組對應的命令
h和H命令是將模式緩存區內容替換掉保持緩存區內容,不過h是副本,即將保持緩存區的就內容覆蓋掉,而H是追加,即在保持緩存區內容上增加新的內容
g和G是將保持緩存區內容替換掉模式緩存區內容,同樣,g是副本、G是追加。
3.利用分號;分割多個編輯命令,這個比起-e選項更NB一點。^_^
# sed '/subject/h; /object/x; $G' input
