看cu大神的sed帖子總結博客,如下,請大神們批評指教。
sed叫做流編輯器,也就是必須要有輸入流,才能對文本進行編輯。
示例文本如下:cat file
1 1
a a
a,a a,a
11=1c 11=1c
11c 11
aaa aaad
1.s 1.sa
1、在每行的下面插入一個空行:
sed ‘G’ file
2、在每行的上面插入一個空行:
sed ‘x;p;x’ file
3、經常會出現,每隔幾行然後就取一次數據的情況。比如從第一行開始,每隔兩行取一次數據。
sed -n ‘1~2p’ file
第一個的數字代表的是從第幾行開始,後面的數字表示的每隔幾行開始取文本。
4、給文本加上號碼
如果是在awk中的話,顯示行號會很簡單,awk ‘{print NR,$0}’,在sed中這樣子實現,sed = file | sed ‘N;s/\n/\t/’
解析:sed = filename是給每一行在上面插入一行,插入的一行是當前文章的行號。sed種的N的意思是將下一行接在上一行的後面,並且把回車換行符替換爲tab符號。有沒有什麼疑問嗎,既然是把下一行直接追加到上一行的後面,那豈不是所有的行都變成了一行了嗎?其實不是這樣子的,只有第一行和第二行,第三行和第四行纔會這樣子處理。
sed '1,$N;s/\n/\t/' file
1 1 a a
a,a a,a 11=1c 11=1c
11c 11 aaa aaad
1.s 1.sa
這個是上面所示的結果。看明白了吧。
5、如果file中存在空行的話,並且空行不顯示序號需要怎麼辦呢?
cat file
1 1
a a
a,a a,a
11=1c 11=1c
11c 11
aaa aaad
1.s 1.sa
處理
sed '/./=' file | sed '/./N;s/\n/\t/'
1 1 1
2 a a
3 a,a a,a
5 11=1c 11=1c
7 11c 11
8 aaa aaad
9 1.s 1.sa
可以看到的是空行的序號雖然沒有顯示,但是存在了。因爲非空行顯示的序列號是不連續的。
6、sed中的模式匹配。
在處理文本的過程中,如果只是針對某些匹配的行進行處理,比如說只對擁有11字符串的行進行上面添加一個空行。
sed ‘/11/{x;p;x}’ file
7、刪除文件開頭或者是結尾處的空格。
雖然是刪除,但是用的命令仍然不是d,命令而是s命令,s命令的意思是替換的意思。刪除空格的話,將空格改爲空就可以。
sed -i 's/^[\t ]*//;s/[\t ]*$//' file
此處是將tab鍵和空格鍵都替換爲空。
8、使行整體偏移,向左偏移做個空格
sed ‘s/^/五個空格/’ file
9、利用括號可以選擇匹配裏面的東西,靈活進行輸出和替換的控制。
cat file
a,hello fd fd fd f, dfdfd
fd df ,f 9fd -pdf ,f df
如果想要輸出的是兩個逗號之間的內容
sed 's/\(.*\),\(.*\),\(.*\)/\2/' file
首先括號要用\\符號來包裹起來,後面的\2表示的是對第二個括號裏面的內容進行引用。
10、模式匹配替換
sed ‘s/a/b/’ file
sed ‘/hello/s/a/b/’ file
把文件中出現hello的行中的第一次出現的a替換成爲b
sed ‘/hello/!s/a/b/’
把文件中沒有出現hello的行第一次出現的a替換成爲b
11、多條件替換
sed ‘s///;s///;s///’ file
如果想進行多次替換。可以將多個替換的語句用逗號連接起來。
12、實現tac效果
首先要確定,執行到每一行,sed把當前處理的行存在臨時的緩衝區內,
稱爲模式空間(pattern space).一旦sed完成對模式空間中行的處理,模式
空間中的行就被送往屏幕.行被處理完成後,就被移出模式空間...
命令執行第一行時,由於匹配了第一行,所以"!G"不起作用,只打印了
第一行的內容,然後"h"把模版塊中的內容也就是第一行的內容拷貝進緩衝區,
注意此時是用第一行的內容替換空行.模式空間中的內容要打印,所以出現1.
執行到第二行時,打印第二行內容,而且由於不匹配"1",所以在後邊"G"命令起
作用,獲得了緩衝區中的第一行的內容,然後加到當前模式空間中,並打印,出現
21。然後把模式空間中的內容寫入緩衝區,也就是把21寫入緩衝區。執行到第三行
匹配不成功,所以緩衝區的內容應該是第二行的內容加上第一行的內容,追加到模
式空間的第三行後邊:321.然後把321拷貝到緩衝區,...以此類推就出現了上
面的結果.
加上最後一句"$!d",那就是前面三行的結果刪除,保留最後一行。這樣就形成了
tac的效果啦。
13、sed在指定的位置添加相應的字符串
sed 's/^/&hello/' file
在行手部之後添加hello字符串
&表示的是匹配的位置
sed ‘s/$/hello&/’ file
sed ‘s/a/&hello/’ file
在匹配到的a字符的後面添加hello字符串