Linux文本處理工具之sed
概念:
sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩存區中,稱為"模式空間(pattern space)",接著用舍得命令處理緩沖區中的內容,處理完成后,把緩存區的內容輸出。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你是用重定向存儲輸出。sed主要用來編輯一個活多個文件。
格式:
sed [-nefri] 'command' 輸入文本
常用選項:
-n:使用安靜(silent)模式。在一般sed的用法中,所有來自STDIN的資料一般都會被列出到終端上。但如果加上-n參數之后,則只有經過sed特殊處理的那一行(或者動作)才會被列出來。
-e:直接在指令列模式上進行sed的動作編輯
-f:直接將sed的動作寫在一個檔案內,-f filename則可以執行filename內的sed動作
-r:sed的動作支援的是延伸正規表示的語法(預設是幾次正規表示法的語法)
-i:直接修改讀取的檔案內容,而不是由熒幕輸出
動作說明:
[n1[,n2]] 常用命令:不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』
常用命令:
a:追加,a的后面可以接字符串,而這些字符串會在新的一行出現(目前的下一行)
c:更改,c的后面可以接字符串,這些字符串可以取代n1,n2之間的行
d:刪除,d的后面不接受任何東西
i:插入,i的后面可以接字符串,而這些字符串會在新的一行出現(目前的上一行)
p:列印,講某個選擇的資料印出,通常會與參數-n一起出現
s:替換,可以直接進行替換的工作,sed 's/要替換的字符串/新的字符串/flags',這里修飾替換的標志flags有:
g:表示在行內進行全局替換,而沒有g時通常只有第一次出現的時候被替換
n:1-512之間的一個數字,表示對本模式中指定模式第n次出現的情況進行替換
p:打印模式空間的內容
w:將模式空間的內容寫入file中
舉例:
1.刪除某行
a.sed '2d' file #刪除第二行
b.sed '$d' file #刪除最后一行
c.sed '1,5d' file #刪除第一行到第五行
d.sed '5,$d' file #刪除第五行到最后一行
e.sed '/My/,/You/d' file #刪除包含"My"的行到包含"You"的行之間的行
f.sed '/My/,10d' file #刪除包含"My"的行到第十行的內容
g.sed '/^$/d' file #刪除空行
2.顯示某行
a.sed -n '2p' file #顯示第二行
b.sed -n '$p' file #顯示最后一行
c.sed -n '1,5p' file #顯示第一行到第五行
d.sed -n '5,$p' file #顯示第五行到最后一行
3.模式進行查詢
a.sed -n '/sed/p' file #查詢包括關鍵字sed所在的所有行
b.sed -n '/\$/p' file #查詢包括關鍵字$所在所有行,使用"\"屏蔽特殊含義
4.增加一行或多行字符串
a.sed '1a test' file #在第一行后新增字符串"test"
b.sed '1,3a test' file #在第一行到第三行后新增字符串"test"
c.sed '1a test\ntest' file #在第一行后新增多行,使用換行符\n
5.替代一行或者多行或者一行中的某部分
a.sed '1c test' file #第一行的內容替換為test
b.sed '1,2c test' file #第一行到第二行的內容替換為test
c.sed '1,5s/a/A/' file #第一到第五中的首個a替換為A
d.sed '/B/s/a/A/g' file #將有B的行中的a替換為A
6.插入
a.sed -i '$a test' file #在最后一行直接輸入test
7.多點編輯
a.sed -e '3,$d' -e 's/Test/test' file #先刪除第三行到最后一行的數據,然后將"Test"替換為"test",$需要和正則表達式的$區分開,在此處表示行的結束
b.sed -e '3,$d; s/Test/test' file #效果同上
8.腳本
a.講以下命令保存在一個文本中(sed-script)
3i\
~~~~~
3,$s/(hrwang) is (mjfan)/\2 is \1/
$a\
We will love eachother forever!!
b. sed -f sed-script file
上邊的腳本還可以進一步的優化
a.將以下命令保持在一個sh腳本中(sed-script)
#!/bin/sed -f
3i\
~~~~~
3,$s/(hrwang) is (mjfan)/\2 is \1/
$a\
We will love eachother forever
b../sed-script file
注意:
1.sed -i 這個動作會直接修改到原始的文件,慎用。
2.sed -e 這個動作表示多點編輯
3.sed腳本就是寫在文件中的一系列sed命令。腳本中,要求命令的末尾不能有任何多余的空格或文本。如果在一行中有多個命令,要用分號分隔。執行腳本時,sed先將輸入文件中第一行復制到模式緩沖區,然后對其執行腳本中所有的命令。每一行處理完畢后,sed再復制文件中下一行到模式緩沖區,對其執行腳本中所有命令。使用sed腳本時,不再用引號來確保sed命令不被shell解釋。
4.sed命令可以指定零個、一個或兩個地址。每個地址都是一個描述模式、行號或者行尋址符號的正則表達式。如果沒有指定地址,那么命令將應用于每一行;如果只有一個地址,那么命令應用于與這個地址匹配的任意行;如果指定了有逗號分隔的兩個地址,那么命令應用于匹配第一個地址的第一行和它后面的行,直到匹配第二個地址的行(包括此行),可以把第一個地址看做是啟用動作,并把第二個地址看做是禁用動作;如果地址后面跟有感嘆號(!),那么命令就應用于不匹配該地址的所有行。
行定位的使用
5.sed命令中c和s的區別(c直接更改,s替換)