![如何 grep 所有结果,使得子模式可能包含也可能不包含在目标模式中?](https://linux22.com/image/144692/%E5%A6%82%E4%BD%95%20grep%20%E6%89%80%E6%9C%89%E7%BB%93%E6%9E%9C%EF%BC%8C%E4%BD%BF%E5%BE%97%E5%AD%90%E6%A8%A1%E5%BC%8F%E5%8F%AF%E8%83%BD%E5%8C%85%E5%90%AB%E4%B9%9F%E5%8F%AF%E8%83%BD%E4%B8%8D%E5%8C%85%E5%90%AB%E5%9C%A8%E7%9B%AE%E6%A0%87%E6%A8%A1%E5%BC%8F%E4%B8%AD%EF%BC%9F.png)
假设我搜索了如下结果的字符串
anything1.knownKeyWord
anything2.knownKeyWord
anything3[1].knownKeyWord
我如何为 grep 编写通用语法,使其匹配所有 3 个字符串。我已经这样做了
^.*\w+\d[\[]?[0]?[\]]?\.knownKeyWord.*$
但我认为对于索引 例如[1]
没有以良好的方式编写,我怎样才能实现,以便即使我替换[1]
为[2342jdsjf]
,我也不必对语法进行太多更改。
答案1
使用扩展正则表达式:
$ grep -E '[[:alnum:]_]+[[:digit:]]+(\[[^]]+\])?\.knownKeyWord' <file
anything1.knownKeyWord
anything2.knownKeyWord
anything3[1].knownKeyWord
这将提取包含格式上的字符串的任何行
XXXNNN[YYY].knownKeyWord
或者
XXXNNN.knownKeyWord
其中XXX
是任何非空字母数字字符串(也可能包括_
),NNN
是任何(一个或多个)数字字符串,并且YYY
是不包括 的任何内容]
。
grep
与-x
if 匹配使用完整的线路。-w
如果匹配应该是完整的,则使用字(即不作为其他东西的子串)。
只是用来sed
显示正则表达式的每个部分匹配的内容:
$ sed -E 's/([[:alnum:]_]+)([[:digit:]]+)(\[[^]]+\])?(\.knownKeyWord)/<\1><\2><\3><\4>/' <file
<anything><1><><.knownKeyWord>
<anything><2><><.knownKeyWord>
<anything><3><[1]><.knownKeyWord>
答案2
尝试这个,
grep -w 'knownKeyWord$' file.txt
从man
-w, --word-正则表达式
Select only those lines containing matches that form whole words. The test is that the matching substring must either be at the beginning of the line, or preceded by a non-word constituent character. Similarly, it must be either at the end of the line or followed by a non-word constituent character. Word- constituent characters are letters, digits, and the underscore.