[英]SED replacing with 'possible' newline
我有一个正常工作的sed命令,除非它在某个地方遇到文件中的换行符。 这是我的命令:
sed -i 's,<a href="\(.*\)">\(.*\)</a>,\2 - \1,g'
现在,它工作得很好,但我只是跑过这个文件,它有a
像这样a
标签:
<a href="link">Click
here now</a>
当然没找到这个。 所以我需要以某种方式修改它以允许搜索中的换行符。 但我不知道如何让它允许,除非我先关闭整个文件然后删除所有\\n
。 问题是我放松了文件中的所有格式。
您可以通过在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)回到:旁边看看我们是否已找到它。 一旦我们找到它,我们继续进行替换。
这是一个快速而肮脏的解决方案,假设链接中只有一个换行符:
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>
,在这种情况下,它会读取模式空间中的下一行并删除换行符。 第二个是你的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.