簡體   English   中英

在shell命令行中將兩個換行符替換為一個換行符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM