純粹為了使用正規表示式而用 perl 補充 shell 腳本是個好主意嗎?

純粹為了使用正規表示式而用 perl 補充 shell 腳本是個好主意嗎?

我正在尋找一種在 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 根本沒有反向引用,因此從字串中提取文字可能會很笨拙。

相關內容