我想使用来自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=
。我该如何纠正?
答案 0 :(得分:2)
在sed中,正则表达式匹配最左边的最长匹配。这意味着正则表达式中的最终.*/
将与该行的最终/
匹配。为了防止这种情况:
sed 's|href="/[^/]*/[^/]*/|href="|g' file.html
正则表达式[^/]*/
将仅与下一个/
匹配。
在python或perl等语言中,我们可以使用非贪婪的正则表达式来解决这个问题。因为sed不支持非贪婪的正则表达式,所以我们必须尝试使用像[^/]*/
这样的技巧来实现类似的效果。
标准警告:通常,html格式可能非常复杂,有很多特殊情况,正则表达式不适合处理。 使用html时,通常最好使用特定于html的工具(如python&#39; beautifulsoup)。