Shell-Script

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

  • April 19, 2012

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

引用自:https://unix.stackexchange.com/questions/36819