搭配 - > 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(”即
我希望上面一行的例子,
我试过这个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(
此外,我希望一行中的所有匹配模式都在输出文件中的一行中。
还建议是否可以通过任何其他方法完成。
答案 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安全的。
使用.*
的问题在于它是贪婪的:它将匹配最长的匹配。你似乎想要最短的比赛。