oneliner - 多文件替换转换会产生不同步的结果

时间:2016-10-05 20:28:26

标签: perl substitution multiple-files

上下文

  • perl 5.22
  • 使用perl oneliner进行多文件转换

概述

TrevorWattanStewie有一个充满配置文件的目录,他想要转换它们。

通过比较“BEFORE”和“AFTER”可以最好地理解转换操作。

文件之前

## ./configfile001.config
TrevorWattanStewie@oldmail.com;--blank--

##  ./configfile002.config
TrevorWattanStewie@oldmail.com;--blank--

## ./configfile003.config
TrevorWattanStewie@oldmail.com;--blank--

## ./configfile004.config
TrevorWattanStewie@oldmail.com;--blank--
SallyWattanStewie@oldmail.com;--blank--
RickyWattanStewie@oldmail.com;--blank--

文件后(所需结果)

## ./configfile001.config
TrevorWattanStewie@newmail.com;configfile001.config

## ./configfile002.config
TrevorWattanStewie@newmail.com;configfile002.config

## ./configfile003.config
TrevorWattanStewie@newmail.com;configfile003.config

## ./configfile004.config
TrevorWattanStewie@newmail.com;configfile004.config
SallyWattanStewie@newmail.com;configfile004.config
RickyWattanStewie@newmail.com;configfile004.config

逐步解释

Trevor希望:

  • 将所有 - blank - 令牌替换为当前正在处理的文件的名称。
  • 将所有子字符串从@oldmail更改为@newmail

特雷弗的尝试

Trevor决定使用perl oneliner脚本完成工作的最快方法。

Trevor使用的oneliner如下:

perl -pi -e '$curf=$ARGV[0];s/--blank--/$curf/; s/@oldmail.com/@newmail.com/;' *.asc

问题

当Trevor运行脚本时,输出不符合他的期望。

实际结果如下:

文件后(实际结果)

## ./configfile001.config
TrevorWattanStewie@oldmail.com;configfile002.config

## ./configfile002.config
TrevorWattanStewie@oldmail.com;configfile003.config

## ./configfile003.config
TrevorWattanStewie@oldmail.com;configfile004.config

## ./configfile004.config
TrevorWattanStewie@oldmail.com;
SallyWattanStewie@oldmail.com;
RickyWattanStewie@oldmail.com;

问题

  • 为什么Trevor的剧本无法将@oldmail转换为@newmail
  • 为什么文件编号不匹配?序列编号关闭一个。

2 个答案:

答案 0 :(得分:3)

您想使用variable $ARGV,这是当前处理文件的名称。

所以s/--blank--/$ARGV/;

此外,@oldmail(等)将在正则表达式内插,Wumpus Q. Wumbley注释。

我总是用-wE运行我的单行。

答案 1 :(得分:2)

Trevor没有启用警告,因此错过了解释:

$ perl -wpi -e '$curf=$ARGV[0];s/--blank--/$curf/; s/@oldmail.com/@newmail.com/;' *.asc
Possible unintended interpolation of @oldmail in string at -e line 1.
Possible unintended interpolation of @newmail in string at -e line 1.

@oldmail@newmail是数组。 s///运算符插入变量,包括数组。您需要使用\@