OneLiner语言 - - 多个文件替换转换会产生不同步的结果



>上下文

  • 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

分步说明

特雷弗希望:

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

特雷弗的尝试

Trevor认为完成工作的最快方法是使用perl 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;

问题

  • 为什么特雷弗的剧本没能把@oldmail变成@newmail
  • 为什么文件编号不匹配?序列号相差 1。

要使用变量 $ARGV ,这是当前处理的文件的名称。

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

此外,@oldmail(等(将在正则表达式中插值,正如Wumpus Q. Wumbley所指出的那样。

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

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///运算符对变量(包括数组(进行内插。您需要使用@

最新更新