【问题标题】:oneliner -- multiple file substitution transformation produces out-of-sync resultsoneliner -- 多文件替换转换产生不同步的结果
【发布时间】:2016-10-06 05:52:35
【问题描述】:

上下文

  • 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 脚本。

特雷弗使用的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
  • 为什么文件编号不匹配?序号减一。

【问题讨论】:

    标签: perl substitution


    【解决方案1】:

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

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

    此外,@oldmail(等)将被插入到正则表达式中,如 Wumpus Q. Wumbley 注释。

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

    【讨论】:

    • 呃...这应该是显而易见的。谢谢zdim。
    【解决方案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/// 运算符插入变量,包括数组。你需要使用\@

    【讨论】:

    • 呃……Trevor 已经盯着这个太久了。这应该是显而易见的。谢谢 Wumpus Q. Wumbley。
    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多