Regex 用复杂正则表达式查找并替换html文件中的字符串
我有数千个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 = ".
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\/)中转义了点