在执行之前测试perl -pi -e单行的最佳方法是什么?

时间:2014-10-06 05:45:39

标签: regex perl

我不知道任何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以外的其他内容开放,但我偏爱其正则表达式格式。

非常感谢!

3 个答案:

答案 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)

两种解决方案。

  1. 删除-i参数,以便将修改后的文件打印到控制台

  2. 指定备用扩展程序-i.bak,以便您可以观察更改并在必要时还原

  3. 无论哪种方式,我都会在没有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