我正在使用中建议的方法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 不受影响地传递它们。