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