Unix 将sed与echo一起使用并读取文件

Unix 将sed与echo一起使用并读取文件,unix,sed,Unix,Sed,我想从html文件中删除除使用sed的文件名以外的目录路径。路径如下所示: <a href="/dir1/dir2/file.mp3" other_tags_here </a> 它删除href=之后的所有内容,只返回href=。如何更正此问题?在sed中,正则表达式匹配最左边最长的匹配。这意味着正则表达式中的最终*/将与行中的最终/匹配。为防止发生这种情况: sed 's|href="/[^/]*/[^/]*/|href="|g' file.html 正则表达式将只与下一个

我想从html文件中删除除使用sed的文件名以外的目录路径。路径如下所示:

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

它删除
href=
之后的所有内容,只返回
href=
。如何更正此问题?

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

sed 's|href="/[^/]*/[^/]*/|href="|g' file.html
正则表达式将只与下一个
/
匹配

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

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

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