尝试更改行时如何将参数传递给 perl?

尝试更改行时如何将参数传递给 perl?

我正在使用中建议的方法https://askubuntu.com/questions/434051/how-to-replace-a-string-on-the-5th-line-of-multiple-text-files修改存档的第一行。假设第一行file.txt

keepme=change1me

我想获得

keepme=newstring

问题是 newstring 存储在 var1 中

我试过:

var1=newstring
perl -i -pe 's/(keepme=)(.*)/$1${var1}/ if $.==1' ../file.txt
perl ${var1} -i -pe 's/(keepme=)(.*)/$1$ARGV[0]/ if $.==1' ../file.txt

在这两种情况下,结果都是

keepme=

如果我做

perl -i -pe ${var1} 's/(keepme=)(.*)/$1$ARGV[0]/ if $.==1' ../file.txt
Can't open s/(genome1=)(.*)/$1$ARGV[0]wq/ if $.==1: No such file or directory

答案1

要访问 Perl 中的环境变量,可以使用 $ENV{var1}。

为此,您可以导出变量,这意味着该变量将被设置,直到您取消设置为止:

导出 var1=新字符串

perl -i -pe 's/(keepme=)(.*)/$1$ENV{var1}/ if $.==1' ../file.txt

或者,如果您只想设置 Perl 命令在执行时使用的变量,则可以在命令前面分配它:

var1=newstring2 perl -i -pe 's/(keepme=)(.*)/$1$ENV{var1}/ if $.==1' ../file.txt

答案2

从第一次尝试开始,您希望${var1}由 shell 扩展,并$保护所有其他变量免受其影响(以便 Perl 扩展它们):

perl -i -pe "s/(keepme=)(.*)/\$1${var1}/ if \$. == 1" ../file.txt

双引号而不是单引号使得 Perl 接收newstring而不是变量名,并且用反斜杠转义其他美元符号使 shell 不受影响地传递它们。

相关内容