2015-02-04 29 views
0

我有一個簡短的perl腳本運行正則表達式替換文件: perl -pi -e 's/x/y/' <file> 我想傳遞一個參數給腳本,所以它會用命令行參數替換y(例如,類似於perl -pi -e 's/x/$argv[1]/' <file>,但我使用$ argv [1]在使用-pi參數時不起作用。傳遞參數到perl與-p

+1

注意'-pi'真的'-p'和'-i',被堆疊在一起的兩個不同的選項。你爲什麼說'$ argv [1]'「不起作用」?什麼不工作?你能向我們展示實際的代碼而不是解釋嗎? –

+0

如何設置bash變量並在你的單行perl中使用它們?像這樣:'Pattern ='foo'&&(echo'foo'| perl -pe's /''$ Pattern''/ bar /')' – qqibrow

+1

@qqibrow,如果'$ Pattern'包含'/' 。 – ikegami

回答

4

我從來沒有理解過關注單行Perl程序,我不明白爲什麼你可以寫一個Perl腳本文件來做到這一點

然而,你可以從@ARGV刪除一個項目,並將其保存在一個變量之前-p循環開始。這樣

perl -p -i -e 'BEGIN{ $r = pop } s/x/$r/' <file> <replacement> 
0

perl -pi -e 's/x/y/' <file>等效於此:

while (<>) { 
    s/x/y/; 
} 
continue { 
    print or die "-p failed: $!\n"; 
} 

這將通過的<file>每行通過表達s/x/y/;和打印結果。 (注意-i標誌將在原地修改<file>)。如果你真的需要通過替換,爲什麼不直接在替換中列出它。無論哪種方式,它仍然只列出一次。

perl -pi -e 's/x/<replacement>/;' <file> 
+0

「如果您確實需要傳入替換項,爲什麼不直接在替換項中列出它。」我猜OP正在shell腳本中調用這一行,並想傳遞一個shell變量。我無法想象爲什麼他們會避免直接使用替換字符串。當然,這只是一個猜測。 – ThisSuitIsBlackNot

+0

難道你不能直接在命令中插入shell變量嗎?例如'perl -pi -e「s/x/$ var /」' –

+0

你也可以。無論如何,這似乎是一個XY問題。 – ThisSuitIsBlackNot

3

解決方案1:推出自己的循環。

perl -i -e'$r = shift; while (<>) { s/x/$r/; print }' "$replacement" "$file" 

解決方案2:在編譯時抓取var。

perl -i -pe'BEGIN { $r = shift; } s/x/$r/' "$replacement" "$file" 

解決方案3:使用的環境變量,而不是一個參數的

R="$replacement" perl -i -pe's/x/$ENV{R}/' "$file"