执行Perl正则匹配URL时报Unmatched ( / [错误该如何修复?
报错原因
- 替换语法不完整:Perl正则替换的标准结构是
s/匹配规则/替换内容/修饰符,你当前仅写了不到一半的匹配规则,既没有替换逻辑段,也没有闭合正则和外层的单引号,导致Perl将命令行后续的无效内容识别为正则的一部分,才触发了Unmatched [的括号不匹配报错。 - 正则本身结构残缺:你给出的正则片段只覆盖了URL前缀的匹配逻辑,既没有域名、路径的完整匹配规则,也没有做好分组括号的配对,本身就存在语法错误。
修复方案
根据你的需求(匹配URL、在域名末尾追加指定内容、自动忽略末尾的]),调整后的完整命令如下,你可以将示例中/你要追加的内容替换为实际需要插入的字符串:
perl -pi -e 's!((?:https?|ftp|file)://|www\.|ftp\.)([a-zA-Z0-9.-]+)(?:/([^\]\s]+))?!$1$2/你要追加的内容/$3!g' myfilepath
代码说明
- 用
!代替/作为正则分隔符,避免URL中大量的/需要额外转义,减少语法出错概率 - 第一个分组匹配URL的协议前缀(http/https/ftp/file)或者www/ftp开头的域名前缀
- 第二个分组匹配完整域名部分
- 第三个分组匹配域名后的路径,匹配规则自动过滤末尾的
]字符和空白符 - 替换时直接在域名后拼接你指定的追加内容,原有路径会自动补在后面
效果示例
原链接https://thisisalink.com/navigate/page替换后变为https://thisisalink.com/你要追加的内容/navigate/page
带末尾]的链接https://test.com/path]替换后变为https://test.com/你要追加的内容/path,自动忽略末尾的]
内容的提问来源于stack exchange,提问作者bastardise
相关产品推荐
相关产品推荐

