小說 sed

看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字符串

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章