exec perl regexp来自tclsh的一个班轮

时间:2016-03-14 08:37:56

标签: perl tcl

我想修改一个ASCII文件。 每行包含

XOR word word

应改为

my insertion XOR word word

这项任务我使用的是简单的PERL单线

perl -i -pe "s/(XOR\s.*)/my insertion (\1)/g" testFile

它在tcsh中运行完美 但是当我从tclsh执行它时,文件没有被修改

tcsh> cat testFile

some text
XOR X1 Y2
another line
yet another line
XOR X2 Y3
something else


tclsh:
%catch {exec perl -pe "s/(XOR\s.*)/my insertion (\1)/g" testFile} res 
0
puts $res

some text
XOR X1 Y2
another line
yet another line
XOR X2 Y3
something else

4 个答案:

答案 0 :(得分:2)

你必须支持表达。

exec perl -i -pe {s/(XOR\s.*)/my insertion (\1)/g} testFile

或者,逃避反斜杠。因为,在双引号内,\s与文字s相同。要表示字面反斜杠,它应该是

exec perl -i -pe "s/(XOR\\s.*)/my insertion (\\1)/g" testFile

答案 1 :(得分:2)

供参考,是纯Tcl解决方案。

+

文档:fileutil包,listpackageprocregsub

答案 2 :(得分:1)

您没有在tcsh脚本中显示关键-i标志 (您显示的命令包含它) - 要更改文件。因此,如果这确实存在于您的脚本中,那么您并没有告诉它编写该文件。

此外,我将一个班轮更改为前置行而不是运行替换。

perl -i -ne 'print "my insertion " . $_ if /^XOR/' testFile

事后添加,为了完整性。

Dinesh解决方案所示,''中的代码也需要包含在{}中以进行保护。

答案 3 :(得分:0)

尝试使用-i修改文件本身

 perl -i -pe  "s/(XOR\s.*)/my insertion (\1)/g" testFile