2015-02-23 20 views
0

我有一大堆的文件,我想改變這樣的事情:不能取代「 n」與「\」不管出於什麼原因

My line of text 

My other line of text 

進入

My line of text\\ 
My other line of text 

看起來很簡單,但它不是。我試過sed s,"\n\n","\\\\\n",以及tr '\n' '\\'以及其他約20個這些命令的化身。

必須有一些事情我不明白...但我完全失去了爲什麼沒有工作。我也有一些滑稽的事情發生,比如當抓取文件時,它不會打印換行符,只會寫入其餘部分寫入的地方。

有誰知道如何做到這一點?

+0

'sed'在逐行的基礎上運行。你不能用它替換換行符(不是沒有花哨的技巧)。另一方面,'tr'應該可以正常工作(儘管將會替換*所有*新行,並且只用一個'\')。 – 2015-02-23 19:28:19

回答

1

sed在線工作。它獲取一行,將你的代碼應用到它,獲取下一行,等等。由於線條被單獨處理,因此多行正則表達式不能很輕鬆地工作。

爲了使用與SED多的正則表達式,你必須先組裝文件中的模式空間,然後在它的工作:

sed ':a $!{ N; ba }; s/\n\n/\\\\\n/g' filename 

這裏的竅門是

:a $!{ N; ba } 

這作品如下:

:a  # jump label for looping 
$!{ # if the end of the input has not been reached 
    N # fetch the next line and append it to what we already have 
    ba # go to :a 
} 

一旦這個結束,整個文件在模式空間,多行正則表達式可以應用於它。當然,這要求文件足夠小以適應內存。

+0

這樣做。謝謝你這麼清楚的解釋,否則對我來說會是什麼樣的情況。 – Mahkoe 2015-02-23 19:42:33

0

sed是面向行的,因此不適合嘗試在跨行的問題上使用。你只需要使用一個面向記錄的工具,如awk:以上

$ awk -v RS='^$' -v ORS= '{gsub(/\n\n/,"\\\\\n")}1' file 
My line of text\\ 
My other line of text 

使用GNU AWK多焦RS。

0

這裏是一個awk是解決這個問題:

如果空行可能包含製表符或空格,用戶這樣的:

awk '!NF{a=a"//"} b{print a} {a=$0;b=NF} END {print a}' file 
My line of text// 
My other line of text 

如果空白行只是什麼也沒有的空白,這應該這樣做:

awk '!NF{a=a"//"} a!=""{print a} {a=$0} END {print a}' file 
+0

如果'a'的數值爲零,則會失敗。 – 2015-02-23 20:39:09

+0

@EdMorton Uff,我再次陷入了這個......如何測試「a」是空白行還是帶空格/製表符的行?這個測試將在頂部打印一個空行'a == 0 || a'' – Jotne 2015-02-23 20:44:48

+0

'a!=「」'我想是你想要的。 – 2015-02-23 20:47:55

0

這可能爲你工作(GNU SED):

sed 'N;s|\n$|//|;P;D' file 

這會在任何時間點在模式空間中保留2行,並用雙斜槓替換空行。

相關問題