我有一个文本文件,其中包含这样的行(只有最后两个字符串很重要):
1 sometext Pattern
2 sometext Pattern 5Asda5}
3 sometext Pattern asd2-asd
4 sometext Pattern a-d
5 sometext Pattern foobar
6 sometext Pattern {asd
7 Pattern Pattern something 123asd
8 Pattern sometext asd
9 Pattern 5h{1,2}b
我需要找到以“Pattern”作为最后一个词的每一行。在这种情况下,单词被定义为带有字母和连字符的字符串。字符串后面可以有前导空格或空格(例如:Pattern\t\t\t\t\t$)
我对此的看法是
egrep '(\bPattern\b +[^a-zA-Z\-]{2,} *$)|(\bPattern\b *$)' file.txt
查找所有带有 Pattern 的行,后跟空格和末尾有一个非“单词”或带有 Pattern 的行。但第一部分并没有按预期工作。我需要另一种方法来找到非单词。
你能告诉我一种 grep 第 1,2,3,6,9 行而不是其余行的方法吗?我喜欢远离 awk,因为我们在课堂上没有介绍它。
答案1
请注意\b
,在grep
支持它的实现中,用于单词字符(数字和下划线)和非单词字符之间的转换(反之亦然)。例如,因此\bPattern\b
会匹配。foo-Pattern.bar
如果您正在寻找空白分隔的图案一句话,你不能使用\b
。
在这里,您似乎正在寻找一个空白分隔符Pattern
,后跟零个或多个空白分隔字符串的列表,这些字符串包含除字母 和 以外的字符-
,因此:
non_word='([^[:blank:]]*[^[:blank:][:alpha:]-][^[:blank:]]*)'
grep -E "(^|[[:blank:]])Pattern([[:blank:]]+$non_word)*[[:blank:]]*$"