簡體   English   中英

sed-如果行未以\\結尾,請刪除換行符

[英]sed - remove line break if line does not end on \"

我有一個tsv。文件,有些行不以'“'結尾,所以現在我想刪除不是直接在'”'之后的所有換行符。 我怎么能用sed做到這一點? 或任何其他bash shell程序...

親切的問候,斯納夫

sed命令應執行以下操作:

sed '/"$/!{N;s/\n//}' file

它說:在不匹配的每一行上, "$ do:

  • 閱讀下一行,將其附加到模式空間;
  • 刪除兩行之間的換行符。

例:

$  cat file.txt
"test"
"qwe
rty"
foo
$  sed '/"$/!{N;s/\n//}' file.txt
"test"
"qwerty"
foo

為了詳細說明@Lev的答案, sed的BSD(OSX)版本對花括號中的命令語法不太寬容-這兩個命令都需要使用分號命令分隔符:

sed '/"$/!{N;s/\n//;}' file.txt

根據此處的文檔 -摘錄:

在地址或地址范圍之后,sed接受大括號“ {...}”,因此可以在該行或該地址范圍匹配的行上應用幾個命令。 在命令行上,分號“;” 分開每條指令,並且必須在大括號之前。

試試這個awk一線嘗試:

awk '{printf "%s%s",$0,(/"$/?"\n":"")}' file

測試

kent$  cat f
"foo"
"bar"
"a long
text with
many many
lines"
"lalala"

kent$  awk '{printf "%s%s",$0,(/"$/?"\n":"")}' f
"foo"
"bar"
"a longtext withmany manylines"
"lalala"

這可能對您有用(GNU sed):

sed ':a;/"$/!{N;s/\n//;ta}' file

這將檢查模式空間的最后一個字符是否為" ,如果不是,則追加另一行,刪除換行符並重復執行,直到滿足條件或遇到文件結尾為止。

一種替代方法是:

sed -r ':a;N;s/([^"])\n/\1/;ta;P;D' file

該機制留給讀者思考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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