我有一個簡短的perl腳本運行正則表達式替換文件: perl -pi -e 's/x/y/' <file>
我想傳遞一個參數給腳本,所以它會用命令行參數替換y(例如,類似於perl -pi -e 's/x/$argv[1]/' <file>
,但我使用$ argv [1]在使用-pi參數時不起作用。傳遞參數到perl與-p
回答
我從來沒有理解過關注單行Perl程序,我不明白爲什麼你可以寫一個Perl腳本文件來做到這一點
然而,你可以從@ARGV
刪除一個項目,並將其保存在一個變量之前-p
循環開始。這樣
perl -p -i -e 'BEGIN{ $r = pop } s/x/$r/' <file> <replacement>
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>
「如果您確實需要傳入替換項,爲什麼不直接在替換項中列出它。」我猜OP正在shell腳本中調用這一行,並想傳遞一個shell變量。我無法想象爲什麼他們會避免直接使用替換字符串。當然,這只是一個猜測。 – ThisSuitIsBlackNot
難道你不能直接在命令中插入shell變量嗎?例如'perl -pi -e「s/x/$ var /」
你也可以。無論如何,這似乎是一個XY問題。 – ThisSuitIsBlackNot
解決方案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"
- 1. 從android studio傳遞-P參數到gradle
- 2. perl傳遞參考
- 3. 在數組中傳遞參數Perl
- 4. 傳遞給函數的Perl參數
- 5. 傳遞參數與點到JavaScript函數
- 6. 參數傳遞的風格在Perl
- 7. Perl參數傳遞特殊字符
- 8. 在perl中傳遞命令行參數
- 9. 如何將參數傳遞給perl qw []?
- 10. Perl的傳遞參數在Windows
- 11. 參數傳遞到PowerShell與C#
- 12. 參數傳遞與initWithNibName:
- 13. REST傳遞參數與Java
- 14. 傳遞參數與ExecJS
- 15. 傳遞參數與AudioServicesAddSystemSoundCompletion
- 16. 傳遞參數與吉斯
- 17. 從html.actionlink與傳遞參數
- 18. 傳遞參數與C#PowerShell
- 19. C#傳遞參數與λ
- 20. 傳遞參數與UnityAction
- 21. 問題與參數傳遞
- 22. 傳遞參數與的addEventListener
- 23. 傳遞表參數與Simple.Data
- 24. 傳遞參數與的AsyncTask
- 25. SQLAlchemy傳遞參數與GeoPandas.from_postgis
- 26. Django傳遞參數與AJAX
- 27. 傳遞參數與ror
- 28. 傳遞參數與call_user_func?
- 29. 傳遞參數與thymeleaf
- 30. 傳遞參數與關聯參數
注意'-pi'真的'-p'和'-i',被堆疊在一起的兩個不同的選項。你爲什麼說'$ argv [1]'「不起作用」?什麼不工作?你能向我們展示實際的代碼而不是解釋嗎? –
如何設置bash變量並在你的單行perl中使用它們?像這樣:'Pattern ='foo'&&(echo'foo'| perl -pe's /''$ Pattern''/ bar /')' – qqibrow
@qqibrow,如果'$ Pattern'包含'/' 。 – ikegami