来自tclsh的exec perl regexp一行程序

来自tclsh的exec perl regexp一行程序,perl,tcl,Perl,Tcl,我想修改一个ASCII文件。 每行包含 XOR word word 应改为 my insertion XOR word word 对于这个任务,我使用简单的PERL one liner perl -i -pe "s/(XOR\s.*)/my insertion (\1)/g" testFile 它在tcsh中工作得非常好 但是当我从tclsh执行它时,文件没有被修改 tcsh> cat testFile some text XOR X1 Y2 another line yet an

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

XOR word word
应改为

my insertion XOR word word
对于这个任务,我使用简单的PERL one liner

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

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

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

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

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

您没有在tcsh脚本中显示critical
-i
标志(您显示的命令中有该标志)——以就地更改文件。因此,如果脚本中确实包含此内容,则不会告诉它编写文件

此外,我会将一行代码更改为行的前置,而不是运行替换

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

为完整起见,在事实之后添加了


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

在tcsh脚本中不显示critical
-i
标志(显示的命令中有该标志)——以就地更改文件。因此,如果脚本中确实包含此内容,则不会告诉它编写文件

此外,我会将一行代码更改为行的前置,而不是运行替换

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

为完整起见,在事实之后添加了


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

您必须将表达式括起来

exec perl -i -pe {s/(XOR\s.*)/my insertion (\1)/g} testFile
或者,避开反斜杠。因为在双引号中,
\s
与literal
s
相同。要表示文字反斜杠,它应该是

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

你必须用括号括住这个表达式

exec perl -i -pe {s/(XOR\s.*)/my insertion (\1)/g} testFile
或者,避开反斜杠。因为在双引号中,
\s
与literal
s
相同。要表示文字反斜杠,它应该是

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

仅供参考,纯Tcl解决方案

package require fileutil

proc rsub {str data} {
    regsub -all -line {^(XOR)\y} $data "$str \\1"
}

::fileutil::updateInPlace testfile [list rsub "my insertion"]

文档:包,,

供参考,纯Tcl解决方案

package require fileutil

proc rsub {str data} {
    regsub -all -line {^(XOR)\y} $data "$str \\1"
}

::fileutil::updateInPlace testfile [list rsub "my insertion"]

文档:包,,

我不是
perl
专家。但是,从
tcl
的角度给出答案。它是有效的!谢谢但如果我用变量代替字符串呢。在这种情况下,{}内的regexp将不会被解析。@RomanKaganovich:那么您应该只使用双引号并相应地转义反斜杠。我不是
perl
专家。但是,从
tcl
的角度给出答案。它是有效的!谢谢但如果我用变量代替字符串呢。在这种情况下,{}内的regexp将不会被解析。@RomanKaganovich:那么您应该只使用双引号,并相应地转义反斜杠。-tclsh示例中的i标志无关紧要,因为我在res变量中获得了输出。顺便说一句,即使添加-i未在perl中修改testfiles,在替换部分中使用
$1
而不是
\1
。-i标志在Tcsh示例中并不重要,因为我在res变量中获得了输出。顺便说一句,即使添加-我没有在perl中修改testfiles,在替换部分中使用
$1
而不是
\1
。感谢您的评论,但这正是我从shell运行纯perl时所做的。谢谢您的评论,但这正是我从shell%exec perl运行纯perl时所做的。$\如果/^XOR/'测试文件无法读取“\”:没有这样的variable@RomanKaganovich我明白了——然后您需要保护参数(
exec perl args
)不受shell解释的影响。我将研究如何具体做到这一点。甚至可以转义几个字符,但最好保护整个表达式。%exec perl-ne“print”my insertion.$\u如果/^XOR/'测试文件无法读取“\”:没有这样的variable@RomanKaganovich我明白了——然后您需要保护参数(
exec perl args
)不受shell解释的影响。我将研究如何具体做到这一点。它甚至可能足以逃脱几个字符,但最好是保护整个表达式。