0

我有一个运行良好的 sed 命令,除非它在文件的某处遇到换行符。这是我的命令:

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

现在,它工作得很好,但我刚刚遇到了这个带有如下a标签的文件:

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

当然没有找到这个。所以我需要以某种方式修改它以允许在搜索中换行。但我不知道如何让它允许这样做,除非我先检查整个文件并\n事先删除所有文件。问题是我丢失了文件中的所有格式。

4

2 回答 2

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) 回到 :next 看看我们是否已经找到它。一旦我们找到它,我们将继续进行替换。

于 2013-04-05T22:45:49.880 回答
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=...>without的存在</a>,在这种情况下,它将下一行读入模式空间并删除换行符。第二个是你的。

于 2013-04-05T22:46:01.497 回答