使用带有echo的sed和从文件中读取

时间:2017-08-27 02:09:25

标签: unix sed

我想使用来自html文件的sed删除除文件名之外的目录路径。路径如下:

<a href="/dir1/dir2/file.mp3" other_tags_here </a>

在目录和文件名中包含空格(%)和其他字符。例如

<a href="/1-%one%2026/two%20_three%four/1-%eight.mp3"

我只需要保留<a href="1-%eight.mp3" other_tags_here <a/>。当我尝试

echo '<a href=/1-%one%2026/two%20_three%four/1-%eight.mp3' | sed 's|href="/.*/.*/|href="|g'

它工作正常。但是当我从html文件中读取时

sed 's|href="/.*/.*/|href="|g' file.html

删除href=之后的所有内容并仅返回href=。我该如何纠正?

1 个答案:

答案 0 :(得分:2)

在sed中,正则表达式匹配最左边的最长匹配。这意味着正则表达式中的最终.*/将与该行的最终/匹配。为了防止这种情况:

sed 's|href="/[^/]*/[^/]*/|href="|g' file.html

正则表达式[^/]*/将仅与下一个/匹配。

在python或perl等语言中,我们可以使用非贪婪的正则表达式来解决这个问题。因为sed不支持非贪婪的正则表达式,所以我们必须尝试使用​​像[^/]*/这样的技巧来实现类似的效果。

标准警告:通常,html格式可能非常复杂,有很多特殊情况,正则表达式不适合处理。  使用html时,通常最好使用特定于html的工具(如python&#39; beautifulsoup)。