用Perl一行命令从文件中删除尾随空格

4

我正在Perl脚本中调用一个Perl一行命令。

这个一行命令的目的是从文件中删除尾随空格。

在主Perl脚本内:

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

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

问题出在哪里?


2
最好的设计是不要这样做。为什么不在你的脚本内部完成需要做的事情,而不是外部调用另一个Perl实例呢? - dan1111
@dan1111 这是情况 - 有一个外部程序在我的脚本读取文件之前使用输入文件。现在,由于文件中的尾随空格,该外部程序失败了。 因此,我想要 1) 删除尾随空格 2) 将更新后的文件传递给外部程序 3) 从程序获取确认 4) 开始在脚本中处理该文件。 - Govind Kailas
1
如果要执行类似的操作,请确保您的命令看起来与您想象的一样:my $cmd = "perl -pi ..."; warn "cmd: $cmd"; $cmd - tinita
3个回答

7

这是因为你的主Perl脚本中有一个特殊变量$/。需要注意的是,变量在``字符串中和在""字符串中一样被插值,而单引号并不改变这一点。你需要转义$

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

1
你还需要转义 \s。如果你开启了警告,你会看到:'Unrecognized escape \s passed through '。 - tinita
$cmd="perl -pi -e 's/\s*$//' tape.txt"; system($cmd); 现在它也替换了\n字符 @tinita 现在它在哪里出问题了? - Govind Kailas
\s 匹配任何空白字符。如果您不想匹配换行符,则将 \\s* 替换为 [ ]*,或者如果您想匹配空格和制表符,则使用 [ \t]*。如果您想保留换行符,则使用 s/\\s*\\n\$/\\n/ - Dan
谢谢@Dan,我已经解决了 :) 这是我的代码 $cmd_remove_tailing="perl -pi -e 's/\\s*\\n\$/\\n/' tape.txt"; system($cmd_remove_tailing); - Govind Kailas

5

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

更简洁的语法可能是:

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

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

另外,添加-l开关可以自动剪切每行读取然后添加一个换行符 --- 这可能是您想要的。


1

\s 匹配 [ \t\n\r\f] ,但不想匹配 \n。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接