2014-10-06 92 views
0
int abc0/0.1 
int abc0/1 
int abc0/1.2 

我使用regexr來創建正則表達式規則,如果存在'。'字符串將匹配行。靠近行尾。我有以下規則:Perl awk正則表達式與標準正則表達式的區別?

int [A-Za-z]*[0-9/]*\.[0-9]* 

它在regexr中完美工作,但它與awk一起使用時不起作用。我需要了解一些差異嗎?

這是我正在使用的線。它在以前更簡單的比賽中運行良好,只是不是這個。

`awk -v RS=! -v ORS= '/int [A-Za-z]*[0-9/]*\.[0-9]*/{print FILENAME}' file`; 

謝謝

+0

'RS =!'的意圖是什麼? – 2014-10-06 18:38:24

回答

1

有沒有這樣的事,作爲一個regexp。只有regexp for tool X,其中X是您的首選工具。對於正則表達式有一些通用的指導原則,但是每個工具都有警告和自己的規則,它們使用哪種正則表達式以及如何指定它們。

例如,/是匹配一個斜槓,但嘗試在AWK一個正則表達式的上下文中使用/或sed的一個RE:

sed '///' file 
awk '///' file 

,都將失敗,語法錯誤,因爲/焦炭也是正則表達式的分隔符等文字/的需要與在另一方面grep的同時進行轉義:

grep '/' file 

它會工作得很好。每個工具都有它自己的警告,許多工具有多種指定相同正則表達式的方式,但其中沒有一個與其他工具完全相同。

這可能強勁是你在找什麼:

$ awk '/int [[:alpha:]]*[[:digit:]/]*\.[[:digit:]]/' file 
int abc0/0.1 
int abc0/1.2 

,但您發佈的RE應該蠻好的工作:

$ awk '/int [A-Za-z]*[0-9/]*\.[0-9]*/' file 
int abc0/0.1 
int abc0/1.2 
1

你需要逃避/正則表達式中:

awk -v RS=! -v ORS= '/int [A-Za-z]*[0-9\/]*\.[0-9]*/{print FILENAME}' file 
+0

我曾嘗試過,既沒有工作。它仍然匹配沒有'。'的行。在裏面。所以在上面的例子中,它匹配第二行以及其他行。 – DJDMorrison 2014-10-06 18:31:01

+0

測試它爲'awk'/ int [A-Za-z] * [0-9 \ /] * \。[0-9] * /'file'來查看它匹配的行。它僅匹配第1行和第3行 – anubhava 2014-10-06 18:33:17

+0

@DJDMorrison當您先前測試過時,您一定忘了逃避'.'。 – 2014-10-06 18:34:19

0

的正則表達式沒有標準。如果你不得不問,原始正則表達式只有3個元字符:.,*,?。剩下的字符代表他們自己。正則表達式各不相同,但是在perl出來之後,它逐漸佔據了大部分「市場」和引擎,並且它總是試圖與perl兼容。因此,您會看到一個名詞「perl compatible regex syntax」,但它仍然不是一個標準。