2014-10-06 82 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”,但它仍然不是一个标准。