2016-07-16 180 views
1

搭配 - > n一個maka(搭配 - >單詞,單詞 - >單詞單詞 - > n A(單詞 - >字符,字符 - >字符chars,字符 - >'n ',字符 - >字符,字符 - >'A'),字 - >字字,字 - >馬(字 - >字符,字符 - >字符字符,字符 - >'m',字符 - >字符,字符 - >'a'),Words - > Word,Word - > ka(Word - > Chars,Chars - > Char Chars,Char - >'k',Chars - > Char,Char - >'a'))模式匹配在一個文件中

我有一個文件包含1000像這樣的線。我想搜索的模式像這樣「字 - > N A(」即,

  1. 它應該開始「字 - >」
  2. 之後,它可以包含在任何情況下
  3. 任意數量字母的
  4. 具有開口托架完 「(」 從上面的行欲

實施例,

  1. 字 - > N A(
  2. 字 - > MA(
  3. 字 - > KA(

我已經試過此grep命令:grep的 - 沒有。 「字 - > *(」 文件名

但是,它返回象這個:

Word - > n A(Word - > Chars,Chars - > Char Chars,Char - >'n',Chars - > Char,Char - >'A'),Words - > Word Words ,單詞 - > ma(單詞 - >字符,字符 - >字符字符,字符 - >'m',字符 - >字符,字符 - >'a'),單詞 - >單詞,單詞 - > ka(

另外我希望所有的匹配模式在一行輸出文件中。

還建議如果它可以通過任何其他方法完成。

回答

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安全的。

使用.*的問題是它很貪婪:它會匹配最長的匹配項。你似乎想要最短的比賽。

+1

謝謝,它工作:) –

相關問題