2014-05-06 68 views
1

的test.txt文件包含:sed - 這裏有什麼區別?

AAAAA 
BBBBB 
CCCCC 

或在十六進制:

41 41 41 41 41 0A 42 42 42 42 42 0A 43 43 43 43 43 0A

如果我運行:

sed s/A/B/g test.txt

它返回:

BBBBB 
BBBBB 
CCCCC 

同樣:

的sed的/ \ X41/B/G'的test.txt

回報:

BBBBB 
BBBBB 
CCCCC 

但如果我運行:

sed的 'S/\ X0A/B/G' 的test.txt

仍然會返回:

AAAAA 
BBBBB 
CCCCC 

爲什麼?

+0

我認爲他期待AAAAABBBBBBBCCCCC – Leo

+1

也許這會有所幫助? http://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n –

+0

看到這個問題的第二個答案 - http://unix.stackexchange.com/questions/114943/ can-sed-replace-new-line-characters - sed似乎一行一行讀取文件,而不是一次讀取整個文件 – Leo

回答

2

sed一次只能在一條線上工作。對於文件的每一行,sed通過從行中刪除新行(\n)並將其置於模式空間並執行一些操作。一旦完成操作,它會將新行重新放回行並默認打印出來,並將下一行讀入模式空間(除非被迫使用-n選項)。這一直持續到文件結束。

對於您的嘗試,當sed讀取第一行時,它已將新行從行中刪除,因此您的替換基本上是空行。一旦完成,它會將新行放回第一行,將其打印出來並將第二行讀入模式空間並繼續。

爲了得到您想要的輸出,您必須將整個文件讀入模式空間,每行用一個換行符分隔。

,你可以這樣做:

$ sed ':a;N;s/\x0A/B/;ba' file 
AAAAABBBBBBBCCCCC 
  • :a創建一個標籤
  • N附加下一行成一個新行分離,這樣你的格局空間沒有包含line1\nline2模式空間。
  • s/\x0A/B/將從模式空間中刪除\n,並用B替換它。
  • ba告訴sed返回標籤:a並重復該過程。
  • 第二次運行sed再次將下一行添加到模式空間中。現在你的圖案空間看起來像line1Bline2\nline3。當替代發生時,您將得到您想要的輸出。