SED替换为“可能的”换行符

时间:2013-04-05 22:27:01

标签: linux sed

我有一个正常工作的sed命令,除非它在某个地方遇到文件中的换行符。这是我的命令:

sed -i 's,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g'

现在,它运行得很完美,但我只是遇到了这个a标签的文件:

<a href="link">Click
        here now</a>

当然没找到这个。所以我需要以某种方式修改它以允许搜索中的换行符。但我不知道如何让它允许,除非我先关闭整个文件并手动删除所有\n。问题是我松开了文件中的所有格式。

2 个答案:

答案 0 :(得分:2)

您可以通过在sed脚本中插入一个循环来完成此操作:

sed -e '/<a href/{;:next;/<\/a>/!{N;b next;};s,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g;}' yourfile

按原样,这将在输出中留下嵌入的换行符,并且不清楚您是否想要它。如果没有,只需替换换行符:

sed -e '/<a href/{;:next;/<\/a>/!{N;b next;};s/\n//g;s,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g;}' yourfile

也许清理额外的空间:

sed -e '/<a href/{;:next;/<\/a>/!{N;b next;};s/\n//g;s/\s\{2,\}/ /g;s,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g;}' yourfile

说明:/<a href/{...}让我们忽略了我们不关心的行。一旦我们找到了我们喜欢的,我们检查它是否有结束标记。如果不是(/<\a>/!),我们抓住下一行,换行符(N)和分支(b)回到:旁边看看我们是否已找到它。一旦我们找到它,我们继续进行替换。

答案 1 :(得分:0)

这是一个快速而肮脏的解决方案,假设链接中只有一个换行符:

sed -i '' -e '/<a href=.*>/{/<\/a>/!{N;s|\n||;};}' -e 's,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g'

第一个命令(/<a href=.*>/{/<\/a>/!{N;s|\n||;};})检查是否存在<a href=...>而没有</a>,在这种情况下,它会读取模式空间中的下一行并删除换行符。第二个是你的。