【问题标题】:Perl one-liner to remove trailing space from a filePerl 单行从文件中删除尾随空格
【发布时间】:2012-09-24 07:52:27
【问题描述】:

我在 Perl 脚本中调用 perl 单行代码。

单行的目的是从文件中删除尾随空格。

在主 perl 脚本内部:

`perl -pi -e 's/\s+$//' tape.txt`;

现在它给我一个错误Substitution replacement not terminated at -e line 2.

哪里出错了?

【问题讨论】:

  • 最好不这样做。为什么不直接在脚本中做你需要做的事情,而不是从外部调用另一个 Perl 实例?
  • @dan1111 情况是这样——在我的脚本读取文件之前,有一个外部程序使用了输入文件。现在这个外部程序由于文件中的尾随空格而失败。所以我想 1)删除尾随空格 2)将更新的文件传递给外部程序 3)从程序中获取确认 4)开始在脚本中处理文件
  • 如果做这样的事情,请始终确保您的命令看起来像您认为的那样:my $cmd = "perl -pi ...";警告“cmd:$cmd”; $cmd

标签: perl


【解决方案1】:

这是因为您的主 perl 脚本中的 $/(特殊变量)。请注意,变量被插入到 `` 字符串中,就像在 "" 字符串中一样,并且其中有一些单引号的事实并没有改变这一点。你需要逃离那个$

`perl -pi -e 's/\s+\$//' tape.txt;`

【讨论】:

  • 您还需要转义 \s。如果你打开了警告,你会看到:'Unrecognized escape \s passed through'
  • $cmd="perl -pi -e 's/\\s*\$//' tape.txt"; system($cmd); 现在它替换了 \n 字符也@tinita 它现在在哪里坏了?
  • \s 匹配任何空格。如果您不想匹配换行符,请将\\s* 替换为[ ]*,或者如果您想匹配空格和制表符,请使用[ \t]*。如果你想保留换行符,那么s/\\s*\\n\$/\\n/
  • 感谢@Dan 我让它工作了:) 这是我现在的代码$cmd_remove_tailing="perl -pi -e 's/\\s*\\n\$/\\n/' tape.txt"; system($cmd_remove_tailing);
【解决方案2】:

反引号语法调用一个 shell,当被调用时,shell 假定它应该插入传递的字符串。

更简洁的语法可能是:

system('perl -pli -e "s/\s*$//" tape.txt');

由于您没有捕获命令的输出,因此使用反引号或 qx 代替 system 不是问题。

同样,添加-l 开关会自动选择每一行读取,然后添加一个换行符 --- 可能是您想要的。

【讨论】:

    【解决方案3】:

    \s 匹配 [ \t\n\r\f] 并且不想匹配 \n。

    注意使用 {} 作为 subst 分隔符:

    $ echo -e 'hi    \nbye'| perl -pe 's{[\t\040]+$}{};' | cat -A
    hi$
    bye$
    

    【讨论】:

      猜你喜欢
      • 2016-02-29
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      相关资源
      最近更新 更多