求Perl/Sed命令:批量替换多文件Begin行的指定字符串
当然可以!下面我给你提供Sed和Perl两种实现方案,完全满足你的需求:
Sed 解决方案
如果你用的是GNU Sed(Linux系统默认),可以直接用下面的命令原地修改所有目标文件:
sed -i 's/Begin("\([^"]*\)","derived from file "\/disks\/setup\/\([^\/"]*\)\.txt");/Begin("\2","derived from file "\/disks\/setup\/\2.txt");/' *.txt
如果是macOS系统(BSD Sed),需要给-i参数加一个空字符串来兼容:
sed -i '' 's/Begin("\([^"]*\)","derived from file "\/disks\/setup\/\([^\/"]*\)\.txt");/Begin("\2","derived from file "\/disks\/setup\/\2.txt");/' *.txt
正则说明:
\([^"]*\):捕获第一个双引号内的内容(比如tmp1),对应你说的“变量1”\([^\/"]*\):捕获最后一个/到.txt前的文件名(比如ORIG_FILE1),对应处理后的“变量2”- 替换时用
\2替换原来的第一个捕获组内容,实现你的需求
Perl 解决方案
Perl的正则表达式更灵活,跨平台兼容性也更好,下面的命令会给原文件生成.bak备份(如果不需要备份,去掉.bak即可):
perl -i.bak -pe 's/Begin\("([^"]+)","derived from file "\/disks\/setup\/([^\/"]+)\.txt"\);/Begin("\2","derived from file "\/disks\/setup\/\2.txt");/' *.txt
参数说明:
-i.bak:原地修改文件,并生成后缀为.bak的备份文件-p:循环处理每一行文本,处理后自动输出- 正则部分逻辑和Sed类似,
([^"]+)和([^\/"]+)分别捕获对应内容,替换时用$2(Perl里用$引用捕获组)替换第一个引号内的内容
注意事项:
- 如果你的文件路径不是固定的
/disks/setup/,可以调整正则里的路径匹配部分 - 把命令里的
*.txt换成你实际要处理的文件名(比如file1.txt file2.txt) - 建议先在单个测试文件上运行命令,确认效果后再批量处理所有文件
内容的提问来源于stack exchange,提问作者Programmer_99999
相关产品推荐
相关产品推荐

