使用复杂的正则表达式查找和替换html文件中的字符串

时间:2016-12-30 19:41:00

标签: regex bash parsing awk command-line

我有数千个html文件,我需要在其中替换字符串。我正在寻找以srchref开头的属性'../''../../',或者下一个主机名尽可能多的时间。

示例:

href = "../../../baz.pl/baz.img"

src="../../foo.example.com/baz.img"

href="../bar.pl/style.css"

我需要用双斜杠替换路径部分。

示例:

../../../baz.pl/baz.img -> //baz.pl/baz.img

我需要在linux bash中实现这一点。什么是最好的解决方案?我应该使用什么命令? 我正在使用grep来匹配字符串。我知道findsed可能是更好的解决方案,但我不能将它们合并在一起。

我工作的正则表达式是:

(?:href|src){1}\=[\"\']{1}((?:\.\.\/)+)[a-z\.].{1,40}(?:\.com|\.pl){1}

如您所见,我只需要匹配plcom

已更新

在Netbeans替换工具这个正则表达式工作:

(href|src){1}\=(\"|\'){1}(?:(?:\.\.\/)+)([a-z\.].{1,40}(?:\.com|\.pl)){1}

替换:

$1=$2//$3

现在如何将其移至Linux bash?

1 个答案:

答案 0 :(得分:1)

您可以awkgensub一起使用,以匹配论坛([.]{2}\/)+

awk -i inplace '{
    print gensub(/(href|src)\s*=\s*\"([.]{2}\/)+(\w)([a-zA-Z0-9_\-\.]+)(.com\/|.pl\/)/,
        "\\1=\"//\\3\\4\\5",
        "g");
}' *.html

此处使用就地文件编辑(-i inplace)来更新现有文档

第一部分将srchref=之前和之后的可选空格匹配:(href|src)\s*=\s*\"

结尾部分匹配.com/.pl/后面的任何内容:(href|src)\s*=\s*\"