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

Regex 用复杂正则表达式查找并替换html文件中的字符串,regex,bash,parsing,awk,command-line,Regex,Bash,Parsing,Awk,Command Line,我有数千个html文件,需要替换其中的字符串。我正在查找属性src和href,它们以'../'或'../../'开头,或者尽可能多地使用主机名 示例: href = "../../../baz.pl/baz.img" src="../../foo.example.com/baz.img" href="../bar.pl/style.css" ../../../baz.pl/baz.img -> //baz.pl/baz.img 我需要用双斜线替换路径部分 示例: href = ".

我有数千个html文件,需要替换其中的字符串。我正在查找属性
src
href
,它们以
'../'
'../../'
开头,或者尽可能多地使用主机名

示例:

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

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

href="../bar.pl/style.css"
../../../baz.pl/baz.img -> //baz.pl/baz.img
我需要用双斜线替换路径部分

示例:

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

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

href="../bar.pl/style.css"
../../../baz.pl/baz.img -> //baz.pl/baz.img
我需要在LinuxBash中实现这一点。最好的解决方案是什么?我应该使用什么命令? 我目前正在与grep合作以匹配字符串。我知道
find
sed
可能是更好的解决方案,但我不能将它们合并在一起

我工作的正则表达式是:

(?:href|src){1}\=[\"\']{1}((?:\.\.\/)+)[a-z\.].{1,40}(?:\.com|\.pl){1}
正如您所看到的,我只需要匹配
pl
com

已更新

在Netbeans替换工具中,此正则表达式工作:

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

$1=$2//$3

现在如何将其移动到Linux bash?

您可以使用
awk
gensub
来匹配组,这里是
([.]{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
)来更新现有文档

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


结尾部分与
.com/
.pl/
(href | src)\s*=\s*\“

查看awk命令谢谢。我要马上测试一下。两个问题<代码>(.*)它是贪婪运算符吗?除非它满足文档中的进一步域
.com
.pl
,否则它不会使用字符串吗?如何在递归更新所有文件的原始名称时实现这一点?我已经用
(\w+)
修复了
(.*)
的问题,相反,它会处理.././foo.example/baz.img.com/a.img这样的情况。我添加了
-I-in-place
来更新文件并匹配目标的所有html文件。就是这样:)我现在正在纠正一些问题。例如,主机名将只有a-z和点(.)字符。我使用+运算符而不是*。我不明白,但是
href=“../../pl/main.html”
也被匹配为特定的{n,y}运算符在awk中不起作用。因此,我从
([.]{2}\/)+
返回到
(\.\.\/)+
,并在
(\.com\/\.pl\/)中转义了点