
我正在尋找一種在 UNIX shell 腳本中使用正規表示式的簡單方法,其中並非每個系統都將 perl 擴充內建到 grep 中。這裡關於 perl regex 真正有用的是後退/前進引用,我還沒有找到在 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 寫整個腳本嗎?
答案1
我不明白為什麼你的 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 根本沒有反向引用,因此從字串中提取文字可能會很笨拙。