在html文件中替换sed

时间:2014-01-14 03:13:50

标签: sed

如何将'index.html'附加到html文件中不以该字词结尾的所有链接?

因此,例如,href="http://mysite/"将成为href="http://mysite/index.html"

4 个答案:

答案 0 :(得分:0)

我不是sed专家,但认为这有效:

sed -e "s_\"\(http://[^\"]*\)/index.html\"_\"\1\"_g" \
    -e "s_\"\(http://[^\"]*[^/]\)/*\"_\"\1/index.html\"_g"

第一个替换发现已在/index.html中结束的URL已删除此结尾。

第二次替换会根据需要添加/index.html。它处理以/结尾的案例以及不符合案件的案件。

存在多个版本的sed。我正在使用XCode for OS X中的那个。

答案 1 :(得分:0)

这个怎么样:

echo 'href="http://mysite/"' | awk '/http/ {sub(/\/\"/,"/index.html\"")}1'
href="http://mysite/index.html"

echo 'href="http://www.google.com/"' | awk '/http/ {sub(/\/\"/,"/index.html\"")}1'
href="http://www.google.com/index.html"

答案 2 :(得分:0)

以href结尾/

sed '\|href="http://.*/| s||\1index.html' YourFile

如果有文件夹引用没有结束/,你应该指定什么是文件或不符合(如文件中带有点的姓氏,...)

答案 3 :(得分:0)

一般来说,这是一个几乎无法解决的问题。如果你的html表现良好",则下面的表达式会搜索"看起来很像URL&#34 ;;你可以在http://regex101.com/r/bZ9mR8处看到它(这显示了几个例子的搜索和替换;它应该适用于大多数其他例子)

((?:(?:https?|ftp):\/{2})(?:(?:[0-9a-z_@-]+\.)+(?:[0-9a-z]){2,4})?(?:(?:\/(?:[~0-9a-z\#\+\%\@\.\/_-]+))?\/)*(?=\s|\"))(\/)?(index\.html?)?

上述匹配的结果应替换为

\1index.html

不幸的是,这需要正则表达式魔法,这远远超出sed的行人能力,因此您必须unleash the power of perl,如下所示:

perl -p -e '((?:(?:https?|ftp):\/{2})(?:(?:[0-9a-z_@-]+\.)+(?:[0-9a-z]){2,4})?(?:(?:\/(?:[~0-9a-z\#\+\%\@\.\/_-]+))?\/)*(?=\s|\"))(\/)?(index\.html?)?/\index.html/gi'

我知道这看起来有点令人生畏。但它的确有效。唯一的问题 - 如果链接在/中结束,则会添加/index.html。您可以轻松获取上述输出并使用

进行处理
sed 's/\/\/index.html/\/index.html/g'

使用单个反斜杠替换double-backslash-before-index.html ...

一些例子(上面的链接中给出了几个例子)

http://www.index.com/                        add /index.html
http://ex.com/a/b/"                          add /index.html
http://www.example.com                       add /index.html
http://www.example.com/something             do nothing
http://www.example.com/something/            add /index.html 
http://www.example.com/something/index.html  do nothing