sed - 如果行没有以\结尾,则删除换行符

时间:2015-07-24 22:08:23

标签: macos sed line-breaks

我有一个tsv.-文件,并且有一些行不以'“'结尾。所以现在我想删除不在'''之后的每个换行符。 我怎么能用sed做到这一点?或任何其他bash shell程序......

亲切的问候, 一团糟

4 个答案:

答案 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

该机制留待读者思考。