Shell-Script
純粹為了使用正則表達式而用 perl 補充 shell 腳本是個好主意嗎?
我正在尋找一種在 UNIX shell 腳本中使用正則表達式的簡單方法,其中並非每個系統都會在 grep 中內置 perl 擴展。這裡對 perl 正則表達式真正有用的是後退/前向引用,我還沒有找到在 sed 中有效使用的方法。我很快想出了以下1個班輪:
tail --bytes=+K something.log| perl -e 'while (my $line = <STDIN>){if ($line =~ /$ARGV[0]/){print $line};}' 'my regex'
Q1。這是為 perl 做事的安全方法嗎?Q2。我應該求助於用 perl 編寫整個腳本嗎?
我不明白為什麼你的 perl 片段是這樣寫的。您可以直接在腳本中編寫正則表達式:
perl -e 'while (my $line = <STDIN>) {if ($line =~ /my regex/) {print $line}}'
這使您可以利用該
-n
選項(作為獎勵,您可以獲得正確的錯誤報告,以防出現輸入錯誤)。進一步使用 perl 成語:perl -ne 'print if /my regex/'
Sed 有反向引用,但是 perl 的擴展正則表達式更強大,有些事情你不能用 sed 做(sed 甚至沒有完整的正則表達式:交替
\|
不是標準功能,儘管許多實現都有它)。大多數你可以用傳統工具做的事情,你可以在 perl 中輕鬆完成。例如,如果你想跳過前 K-1 個字節,你可以寫
perl -ne 'BEGIN {read ARGV, "", 42-1}; …'
如果想要可移植性,可以在 awk 中完成很多文本處理任務,但是 awk 根本沒有反向引用,因此從字元串中提取文本可能會很笨拙。