我正在尝试替换VMS上的文本文件中的特定行.通常,这是一个简单的Perl单线程.但是当替换方是包含VMS路径的符号时,我遇到了问题.这是文件和我尝试的内容:
file1.txt的内容:
foo
bar
baz
quux
Run Code Online (Sandbox Code Playgroud)
尝试替换第3行:
$ mysub = "disk$data1:[path.to]file.txt"
$ perl -pe "s/baz/''mysub'/" file1.txt
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
foo
bar
disk:[path.to]file.txt
quux
Run Code Online (Sandbox Code Playgroud)
看起来Perl过于苛刻,用$data1一个不存在的变量的内容替换了路径的一部分(即什么都没有).运行调试器确认了这一点.我没有提供/e,所以我认为Perl应该直接替换文本.有没有办法让Perl这样做?
(另请注意,我可以在linux命令行中重现类似的行为.)
小智 4
通过正确的引号和双引号的组合,您可以到达那里:
我们创建“字符串”+“替换符号”+“字符串”的紧密串联。两个双引号字符串包含用于替换的单引号。做作...但它有效。
$ perl -pe "s'baz'"'mysub'"'" file1.txt
Run Code Online (Sandbox Code Playgroud)
这是DCL级别的解决方案。
对于 Perl 解决方案,请使用q()非内插字符串的运算符并执行它。使用简单的 DCL 替换将符号填充到括号中。这是我最喜欢的,因为它(几乎)对我来说很有意义,并且不会与引号混淆。
$ perl -pe "s/baz/q(''mysub')/e" file1.txt
Run Code Online (Sandbox Code Playgroud)