[英]replace two newlines to one in shell command line
關於將多個換行符替換為一個換行符有很多問題,但沒有人對我有用。
我有一個文件:
first line
second line MARKER
third line MARKER
other lines
many other lines
我需要在MARKER
之后將兩個換行符(如果它們存在)替換為一個換行符。 結果文件應該是:
first line
second line MARKER
third line MARKER
other lines
many other lines
我試過sed ':a;N;$!ba;s/MARKER\\n\\n/MARKER\\n/g'
失敗。
sed
對於單行替換很有用,但是對換行有問題。 它找不到\\n\\n
我試過perl -i -p -e 's/MARKER\\n\\n/MARKER\\n/g'
失敗。
這個解決方案看起來更接近,但似乎regexp沒有對\\n\\n
作出反應。
是否可以在MARKER
之后替換\\n\\n
,而不是替換文件中的其他\\n\\n
?
我對單行解決方案感興趣,而不是腳本。
您的Perl解決方案不起作用,因為您正在搜索包含兩個換行符的行。 哪有這回事。 這是一個解決方案:
perl -ne'print if !$m || !/^$/; $m = /MARKER$/;' infile > outfile
或就地:
perl -i~ -ne'print if !$m || !/^$/; $m = /MARKER$/;' file
如果您可以將整個文件加載到內存中,則可以使用
perl -0777pe's/MARKER\n\n/MARKER\n/g;' infile > outfile
要么
perl -0777pe's/MARKER\n\K\n//g;' infile > outfile
如上所述,您可以使用-i~
進行就地編輯。 如果您不想進行備份,請刪除~
。
我認為你走在了正確的軌道上。 在多行程序中,您可以將整個文件加載到單個標量中並在其上運行此替換:
s/MARKER\n\n/MARKER\n/g
獲取單行將文件加載到多行字符串的技巧是在BEGIN
塊中設置$/
。 在讀取輸入之前,此代碼將執行一次。
perl -i -pe 'BEGIN{$/=undef} s/MARKER\n\n/MARKER\n/g' input
AWK:
kent$ cat a
first line
second line MARKER
third line MARKER
other lines
many other lines
kent$ awk 'BEGIN{RS="\x034"} {gsub(/MARKER\n\n/,"MARKER\n");printf $0}' a
first line
second line MARKER
third line MARKER
other lines
many other lines
awk '
marker { marker = 0; if (/^$/) next }
/MARKER/ { marker = 1 }
{ print }
'
這可以在非常簡單的sed
。
sed '/MARKER$/{n;/./!d}'
這可能對你有用:
sed '/MARKER/,//{//!d}'
說明:
刪除MARKER
保留MARKER
行之間的所有行。
要么:
sed '/MARKER/{n;N;//D}'
說明:
閱讀MARKER
之后的下一行,然后在此之后添加該行。 如果當前行是MARKER
行,則刪除上一行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.