Perl正向回顾后发断言匹配换行空格本地失效问题求助
问题原因
Perl的-p选项默认逐行读取输入,每一行单独作为匹配上下文。你的正则(?<=c9\n\s{4}Hostname )ec2.+包含跨两行的内容(c9在第一行,Hostname在第二行),逐行处理时这部分内容不会出现在同一行的缓冲区中,因此匹配失败。而regex101是将整个文件作为单一字符串处理,所以能正常匹配跨行模式。
解决方案
方法1:一次性读取整个文件(适合小文件)
使用-0777参数让Perl读取全部输入内容,这样跨行正则就能正常匹配:
# 预览修改结果 perl -0777 -pe 's/(?<=c9\n\s{4}Hostname )ec2.+/TEST/g' ~/.ssh/config # 直接修改文件(生成.bak备份) perl -0777 -i.bak -pe 's/(?<=c9\n\s{4}Hostname )ec2.+/TEST/g' ~/.ssh/config
方法2:逐行跟踪状态(适合大文件)
通过状态变量标记是否处于Host c9的后续行,避免跨行匹配:
# 预览修改结果 perl -pe ' if ($in_c9) { s/^( Hostname ).+/\1TEST/; $in_c9 = 0; } $in_c9 = 1 if /^Host c9$/; ' ~/.ssh/config # 直接修改文件(生成.bak备份) perl -i.bak -pe ' if ($in_c9) { s/^( Hostname ).+/\1TEST/; $in_c9 = 0; } $in_c9 = 1 if /^Host c9$/; ' ~/.ssh/config
两种方法都能将原配置中的Hostname ec2-xxx.compute.amazonaws.com替换为Hostname TEST,得到预期输出。
内容的提问来源于stack exchange,提问作者user3479780
相关产品推荐
相关产品推荐

