您可以通过在 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 看看我们是否已经找到它。一旦我们找到它,我们将继续进行替换。