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思考
我有一个 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思考