我不知道任何Perl,但我偶尔会使用“perl pie”(perl -pi -e
)进行批量正则表达式查找和替换,例如在a
文件夹中的所有.txt文件中将e
更改为perl -pi -e 's|a|e|g' *.txt
。
有没有办法进行“干运行”,以便我可以预览更改?我经常使用具有正面/负面前瞻/外观,群组参考等的中等复杂的正则表达式,而且我通常不会100%确定我在第一次运行时正确。像rename.pl的-n
标志这样的东西精彩,它不会改变任何东西,只会输出本来会发生的变化。
目前,我的策略是只使用接受Perl正则表达式的ack来确保我的匹配字符串是正确的,并从那里开始。有没有更好的办法?像rename -n
?
如果我遗漏了一些令人敬畏的东西,也会对perl
以外的其他内容开放,但我偏爱其正则表达式格式。
非常感谢!
答案 0 :(得分:4)
只需从perl代码中删除-i
参数即可进行干运行。
perl -pe 's|a|e|g' *.txt
来自perl --help
,
-i[extension] edit <> files in place (makes backup if extension supplied)
打印更换发生的特定行。
$ cat file
abcd
cbcb
foo
$ perl -nle 'print if s|a|e|g' file
ebcd
答案 1 :(得分:3)
两种解决方案。
删除-i
参数,以便将修改后的文件打印到控制台
指定备用扩展程序-i.bak
,以便您可以观察更改并在必要时还原
无论哪种方式,我都会在没有glob *.txt
的情况下进行测试,而是在确定它正常工作之前对单个文件进行测试。
我可能会倾向于使用单个文件的第二个选项。这样,您可以轻松地执行diff
来观察发生的变化。
$ perl -i.bak -pe 's|a|e|g' sample.txt
$ diff sample.txt sample.txt.bak
答案 2 :(得分:0)
基于 @8henrie's comment,以下显示了 git 所做的更改:
for f in *.txt; do perl -pe 's/a/e/g' "$f" | git diff --no-index -- - "$f"; done
检查后,您可以使用以下方法执行实际替换:
perl -pi -e 's/a/e/g' *.txt