我需要引用行尾並使用this解決方案來替換文件有多行時完美工作的行尾。sed:替換行尾
當我嘗試使用這種方法的文件沒有\n
或單行以\n
結尾時出現問題。在這種情況下,sed
不會取代任何內容,即使第二個s/
命令也不起作用。也看起來像線的末尾永遠不會被取代。
我的命令是:
sed ':a;N;$!ba;s/\n/\\n/g;s/a/_/g' <file>
(取代\n
到\\n
和替換a
到_
例如)。
我用hexdump -C
在這裏顯示的文件:
有測試我做:
$ # Test1. single line without \n
$ echo -n 'abc' | sed ':a;N;$!ba;s/\n/\\n/g;s/a/_/g' | hexdump -C
00000000 61 62 63 |abc|
# but expected "_bc"
$ # Test2. single line with \n
$ echo 'abc' | sed ':a;N;$!ba;s/\n/\\n/g;s/a/_/g' | hexdump -C
00000000 61 62 63 0a |abc.|
# but expected "_bc\n"
$ # Test3. two lines
$ echo -e 'abc\n' | sed ':a;N;$!ba;s/\n/\\n/g;s/a/_/g' | hexdump -C
00000000 5f 62 63 5c 6e 0a |_bc\n.|
# but expected "_bc\n\n"
問題:爲什麼第二s/
不能取代的Test1和Test2的東西嗎?在所有這些測試中,是否有任何方法可以修復替換s/\n/\\n/
和s/a/_/g
?
P.S .:我不想要一些解決方法,比如在sed處理之前在流尾添加換行符,並在刪除之後刪除它。
編輯:看起來像N
命令不會讀取單行,即使它後跟'\ n'。任何想法如何解決它?
編輯2:看起來像這樣是expected behavior of N
command。有沒有什麼方法可以取代最後一行的結尾?
我最近使用過這個:sed'{:q; N; s/\ n/_/g; t q}' – svante
您是否嘗試過分離sed部分? 'sed':a; N; $!ba' | sed的/ \ n/\\ n/g; s/a/_/g''或類似的。 –
svante
這沒有幫助,因爲它等於'cat | sed's/\ n/\\ n/g; s/a/_/g''。使用'':a; N; $!ba''連接線正在一個sed過程中工作。 –
loentar