Files

嘗試更改行時如何將參數傳遞給perl?

  • March 10, 2015

我正在使用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

從您的第一次嘗試開始,您希望${var1}通過 shell 擴展,並且所有其他$變數都不受它的保護(以便 Perl 擴展它們):

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

雙引號,而不是單引號,使得 Perl 接收newstring而不是變數名,並且用反斜杠轉義其他美元符號使 shell 不受影響地通過它們。

要在 Perl 中訪問環境變數,您可以使用 $ENV{var1}。

為此,您可以導出變數,這意味著變數已設置,直到您取消設置:

導出 var1=newstring

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

或者,如果您只想設置 Perl 命令在執行時使用的變數,您可以在命令前面指定它:

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

引用自:https://unix.stackexchange.com/questions/189365