文件中的模式匹配

时间:2016-07-16 18:54:35

标签: regex grep

  

搭配 - > n maka(搭配 - >单词,单词 - >单词单词,单词 - > n A(Word - > Chars,Chars - > Char Chars,Char - >'n',Chars - > Char ,Char - >'A'),单词 - >单词单词,单词 - > ma(Word - > Chars,Chars - > Char Chars,Char - >'m',Chars - > Char, Char - >'a'),单词 - >单词,单词 - > ka(Word - > Chars,Chars - > Char Chars,Char - >'k',Chars - > Char,Char - >'a'))

我有一个包含1000个这样的行的文件。我想搜索这样的模式“Word - > n A(”即

  1. 它应该以“Word - >”
  2. 开头
  3. 之后,它可以包含任意数量的字母
  4. 以开口括号结束“(”
  5. 我希望上面一行的例子,

    1. Word - > n A(
    2. Word - > m a(
    3. Word - > k a(
    4. 我试过这个grep命令: grep -no“Word - >。*(”filename

      但是,它会像这样返回:

        

      Word - > n A(Word - > Chars,Chars - > Char Chars,Char - >'n',Chars - > Char,Char - >'A'),Words - >单词单词,单词 - > m a(Word - > Chars,Chars - > Char Chars,Char - >'m',Chars - > Char,Char - >'a'),Words - > Word,Word - > k a(

      此外,我希望一行中的所有匹配模式都在输出文件中的一行中。

      还建议是否可以通过任何其他方法完成。

1 个答案:

答案 0 :(得分:0)

$ grep -no 'Word -> [[:alpha:] ]\+(' file
1:Word -> n A (
1:Word -> m a (
1:Word -> k a (

以上显示了正则表达式匹配的原始文件中的行号。相反,如果你想要按顺序编号的匹配,那么:

$ grep -o 'Word -> [[:alpha:] ]\+(' file | cat -n
     1  Word -> n A (
     2  Word -> m a (
     3  Word -> k a (

原始代码使用.*。这有两个问题。一个是.匹配任何内容,包括(。第二个是正则表达式是贪婪的:它匹配最长的匹配字符串。

此处,我们使用.*代替[[:alpha:] ]\+。这匹配一个或多个字母和空格。由于这只匹配字母和空格,因此它不匹配(,因此匹配将是您想要的长度。

请注意,我们使用[:alpha:]来匹配字母。与[a-zA-Z]之类的旧表单不同,[:alpha:]是unicode安全的。

使用.*的问题在于它是贪婪的:它将匹配最长的匹配。你似乎想要最短的比赛。