我有一个tsv.-文件,并且有一些行不以'“'结尾。所以现在我想删除不在'''之后的每个换行符。 我怎么能用sed做到这一点?或任何其他bash shell程序......
亲切的问候, 一团糟
答案 0 :(得分:3)
这个sed
命令应该这样做:
sed '/"$/!{N;s/\n//}' file
它说:在不匹配"$
的每一行上都执行:
示例:
$ cat file.txt
"test"
"qwe
rty"
foo
$ sed '/"$/!{N;s/\n//}' file.txt
"test"
"qwerty"
foo
答案 1 :(得分:3)
要详细说明@Lev的答案,sed
的BSD(OSX)版本对大括号内的命令语法不太宽容 - 两个命令都需要分号命令分隔符:
sed '/"$/!{N;s/\n//;}' file.txt
每个documentation - 摘录:
在地址或地址范围之后,sed接受花括号“{...}”,因此可以将几个命令应用于该行或地址范围匹配的行。在命令行上,分号';'将每条指令分开,并且必须在结束括号之前。
答案 2 :(得分:1)
试试这个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"
答案 3 :(得分:0)
这可能适合你(GNU sed):
sed ':a;/"$/!{N;s/\n//;ta}' file
这将检查模式空间的最后一个字符是否为"
,如果没有附加另一行,则删除换行符并重复,直到满足条件或遇到文件结尾。
另一种选择是:
sed -r ':a;N;s/([^"])\n/\1/;ta;P;D' file
该机制留待读者思考。