如何使用SED用URL中的连字符替换下划线?

时间:2014-04-13 18:33:10

标签: sed

嗨,这看起来像是一个常见问题,但我无法通过谷歌搜索或SO找到解决方案。在保存在本地目录中的几个HTML文件中,我需要将URL从http://www.myblog.com更改为使用URL末尾部分的下划线,而不是使用连字符。 (任何其他URL都需要保持不变。)我使用Ubuntu Linux,我认为SED将在这里为我工作,但如果有用,可以使用其他工具。

因此,如果HTML文件包含:

<a href="http://www.myblog.com/my_blog_article">...</a>

我需要将其切换为:

<a href="http://www.myblog.com/my-blog-article">...</a>

相关网址仅会出现在HTML锚标记中。此外,下划线到连字符部分将仅出现在结尾部分(即,在URL字符串中的最后一个“/”之后)。我不能只进行全局搜索和替换(s / _ / - / g)因为其他网站可能存在URL,而其他下划线与我不想改变的URL无关。

2 个答案:

答案 0 :(得分:0)

您可以使用awk

awk -F\" '{for (i=1;i<=NF;i++) if ($i~/http/) {n=split($i,a,"/");gsub(/_/,"-",a[n]);for (j=1;j<=n;j++) {s=s (s?"/":"") a[j];$i=s}}print $0}' OFS=\" file
<a href="http://www.myblog.com/my-blog-article">data with_underscore</a>

这只会在_

的文件路径中替换url

更易阅读的版本:

awk -F\" '
    {for (i=1;i<=NF;i++)
        if ($i~/http/) {
            n=split($i,a,"/")
            gsub(/_/,"-",a[n])
            for (j=1;j<=n;j++) {
                s=s (s?"/":"") a[j]
                $i=s}
            }
        print $0
    }' OFS=\" file

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -r ':a;/<a href="http:\/\/www.myblog.com\/[^"]*_[^"]*"/{s//\n&\n/;h;y/_/-/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/;ba}' file

如果某行包含问题中显示的网址,请按标记包围网址(在这种情况下为换行符),复制该行,然后将&#39; _&#39;&#39;转换为&# 39; - &#39;&#39; S。附加原始线并使用标记作为参考线重新组装。重复此过程,直到处理完所有网址。