oneliner -- 多文件替换转换产生不同步的结果
oneliner -- multiple file substitution transformation produces out-of-sync results
上下文
- 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 脚本。
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
?
- 为什么文件编号不匹配?序号差一
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
。
上下文
- 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 脚本。
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
? - 为什么文件编号不匹配?序号差一
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
。