sed - 如果行不以 \" 结尾,则删除换行符

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

我有一个 tsv.-file,有些行不以 '"' 结尾。所以现在我想删除所有不在 '"' 之后的换行符。 我怎样才能用 sed 完成它?或任何其他 bash shell 程序...

亲切的问候, 乱七八糟

这个 sed 命令应该可以做到:

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

它说:在每一行不匹配 "$ 做:

  • 读取下一行,将其附加到模式 space;
  • 去掉两行之间的换行符。

示例:

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

试试这个 awk 单行代码:

awk '{printf "%s%s",[=10=],(/"$/?"\n":"")}' file

测试

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

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

为了详细说明@Lev 的回答,sed 的 BSD (OSX) 版本对大括号内的命令语法不太宽容——两个命令都需要分号命令分隔符:

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

根据此处的 documentation -- 摘录:

Following an address or address range, sed accepts curly braces '{...}' so several commands may be applied to that line or to the lines matched by the address range. On the command line, semicolons ';' separate each instruction and must precede the closing brace.

这可能适合您 (GNU sed):

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

这将检查模式 space 的最后一个字符是否为 ",如果不是,则追加另一行,删除换行符并重复直到满足条件或文件结束遇到了。

备选方案是:

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

机制留待reader思考