如何在>之间仅删除一个换行符[大于]和<在unix中[小于]

时间:2016-07-23 07:06:30

标签: linux shell unix sed newline

让我们考虑以下格式的文字:

"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'

但他们都没有成功。来自天才头脑的任何建议?

3 个答案:

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

在模式空间中读取两行,如果换行符在><之间,则将其删除。然后打印并删除第一行并重复。