我有一个正常工作的sed命令,除非它在某个地方遇到文件中的换行符。这是我的命令:
sed -i 's,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g'
现在,它运行得很完美,但我只是遇到了这个a
标签的文件:
<a href="link">Click
here now</a>
当然没找到这个。所以我需要以某种方式修改它以允许搜索中的换行符。但我不知道如何让它允许,除非我先关闭整个文件并手动删除所有\n
。问题是我松开了文件中的所有格式。
答案 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>
,在这种情况下,它会读取模式空间中的下一行并删除换行符。第二个是你的。