让我们考虑以下格式的文字:
"this\n is >\n<"
我想在&gt;之间截断换行符和&lt;这将导致:
"this\n is ><"
如何实现这一目标?
我尝试使用以下内容:
echo "this\n is >\n<" | sed -e 's/>\n<//g'
和
echo "this\n is >\n<" | sed -e 's/>\\n</></g'
但他们都没有成功。来自天才头脑的任何建议?
答案 0 :(得分:1)
sed逐行工作,但你可以将其破解成形:
printf 'this\n is >\n<\n' | sed ':a;N;$!ba;s/>\n</></g'
这是一个老式的模式,你可以在其他地方找到。
基本上,:a
创建了一个标签,N
将模式空间中的当前和下一行组合在一起,$!ba
分支到一个if,而不是在最后(意味着它一直持续到所有输入都在一个模式空间中),然后下一个是替换(s/>\n</></g
),它现在适用于所有行。
还有其他选择,但这可能是最便携的,因为sed比其他可以像Perl这样的工具更多地方。你可以用awk破解它,但我不知道如何做到这一点,如果没有它比这个解决方案更冗长。
答案 1 :(得分:0)
\
n
你非常接近:
$ echo "this\n is >\n<" | sed -e 's/>\\n</></g'
this\n is ><
在sed中,\n
是换行符。但是,您的字符串没有换行符:它后面跟有n
斜杠。所以,我们需要告诉sed寻找slash-n。这是通过加倍斜线来完成的。
使用echo
(无选项),字符串没有换行符:
$ echo "this\n is >\n<"
this\n is >\n<
但是,如果我们使用printf,\
n
序列将转换为换行符:
$ printf "this\n is >\n<"
this
is >
<
我们可以使用GNU sed删除尖括号之间的换行符:
$ printf "this\n is >\n<" | sed -z 's/>\n</></g'
this
is ><
(在Mac OSX上,GNU sed称为gsed
。)
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed ':a;N;s/>\n</></;ta;P;D' file
在模式空间中读取两行,如果换行符在>
和<
之间,则将其删除。然后打印并删除第一行并重复。