我試圖匹配以下格式記錄:多平臺的perl腳本awk或
(-,username,domain1.co.uk)\
(-,username,domain2.co.uk)
無論是AWK或Perl必須使用。我使用Cygwin和寫了下面這工作和同時匹配以上項目代碼:
awk 'BEGIN {musr="(-,username,[^)]+.co.uk)"} {if ($0~musr) print $0}' netgroup
但是,如果我嘗試修改這個正則表達式更具體的輸出是什麼:
1:匹配記錄,則最後反斜線然後匹配換行符:
"(-,username,[^)]+.co.uk)\\$"
第二:賽會紀錄後immediatelly新行沒有反斜線:
"(-,username,[^)]+.co.uk)$"
所以我決定將腳本重寫爲perl,希望perl可以處理反斜槓和行尾符號。爲此我使用A2P這樣:
echo 'BEGIN {musr="(-,username,[^)]+.co.uk)"} {if ($0~musr) print $0}' | a2p.exe
#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"[email protected]"}'
if $running_under_some_shell;
# this emulates #! processing on NIH machines.
# (remove #! line above if indigestible)
eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
# process any FOO=bar switches
$, = ' '; # set output field separator
$\ = "\n"; # set output record separator
$musr = '(-,username,[^)]+.co.uk)';
while (<>) {
chomp; # strip record separator
if ($_ =~ $musr) {
print $_;
}
}
這個生成的perl腳本也都條目相匹配,但是如果我試圖修改此腳本,以更具體的我收到以下錯誤:
1:
$musr = "(-,username,[^)]+.co.uk)\\";
Trailing \ in regex m/(-,username,[^)]+.co.uk)\/ at perlmatch.pl line 18, <> line 1.
第二:
$musr = "(-,username,[^)]+.co.uk)$";
Final $ should be \$ or $name at perlmatch.pl line 14, within string
syntax error at perlmatch.pl line 14, near "= "(-,username,[^)]+.co.uk)$""
Execution of perlmatch.pl aborted due to compilation errors.
3:
$musr = "(-,username,[^)]+.co.uk)\$";
[the output is nothing]
我在做什麼錯了?我的問題也指出,如果有人需要在多個平臺(aix,solaris,linux)上使用腳本,而不是使用perl,應該是處理(非)GNU utils和各種(g | n)awk版本等更好的方法。問候
謝謝qr操作員是我一直在尋找的東西。 –
當然也逃避了括號。還有一個問題,爲什麼應該有qr並且簡單地引用正則表達式還不夠? Regards –
@Wakan Tanka,正則表達式使用特殊的語法,其中某些字符和某些轉義碼具有特殊含義。因此,Perl爲您提供了特殊的'qr //'運算符來處理這個問題。如果你不得不把它放在一個普通的字符串中,你需要有兩層轉義:一個用於字符串,另一個用於正則表達式。這造成了一個難以理解的混亂。 – dan1111