【发布时间】:2015-10-15 17:11:00
【问题描述】:
我有一个 tsv.-file 并且有些行不以 '"' 结尾。所以现在我想删除不是直接在 '"' 之后的每个换行符。 我怎么能用 sed 做到这一点?或任何其他 bash shell 程序...
亲切的问候, 乱七八糟
【问题讨论】:
标签: macos sed line-breaks
我有一个 tsv.-file 并且有些行不以 '"' 结尾。所以现在我想删除不是直接在 '"' 之后的每个换行符。 我怎么能用 sed 做到这一点?或任何其他 bash shell 程序...
亲切的问候, 乱七八糟
【问题讨论】:
标签: macos sed line-breaks
这可能对你有用(GNU sed):
sed ':a;/"$/!{N;s/\n//;ta}' file
这会检查模式空间的最后一个字符是否为",如果不是,则追加另一行,删除换行符并重复,直到满足条件或遇到文件结尾。
另一种选择是:
sed -r ':a;N;s/([^"])\n/\1/;ta;P;D' file
机制留给读者思考。
【讨论】:
为了详细说明@Lev 的答案,sed 的 BSD (OSX) 版本对大括号内的命令语法不太宽容——两个命令都需要分号命令分隔符:
sed '/"$/!{N;s/\n//;}' file.txt
这里是documentation——摘录:
在地址或地址范围之后,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"
【讨论】:
这个sed 命令应该这样做:
sed '/"$/!{N;s/\n//}' file
它说:在每一行不匹配"$ 做:
例子:
$ cat file.txt
"test"
"qwe
rty"
foo
$ sed '/"$/!{N;s/\n//}' file.txt
"test"
"qwerty"
foo
【讨论】:
$。 /slashes/ 中包含的地址由正则表达式匹配。正则表达式是"$,即引号后跟行尾。这与 OP 的“不在" 之后的换行符”的要求相反。