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

oneliner -- multiple file substitution transformation produces out-of-sync results

上下文

概览

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 决定完成工作的最快方法是使用 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 没有启用警告,因此错过了解释:

$ 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/// 运算符插入变量,包括数组。您需要使用 \@

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

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

此外,@oldmail(等)将在正则表达式中插入,如 Wumpus Q. Wumbley 所述。

我总是 运行 我的单线 -wE