Grep 完整名称,包括单词中的点

Grep 完整名称,包括单词中的点

kshshell 脚本中,我使用grep命令来获取特定单词,如下所示。

$ cat file.txt
abc xyzdef.123 def.jkl mnopqrst

$ grep -o "\wdef\w" file.txt
xyzdef
def

我希望输出是xyzdef.123并且def.jkl

.它没有在“是否还有其他方法可以访问这个词”之后获取值grep,而且我也不知道确切的词,grep只知道一个模式。我正在研究ksh外壳。

答案1

看起来您只需要字符串def及其周围的所有非空白字符。如果是这样,您可以使用:

$ grep -Eo '\S*def\S*' file.txt 
xyzdef.123
def.jkl

表示非空白,GNU通过 或标志\S支持。grep-E-P

答案2

使用grep -oPOSIX 字符类:

grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt

这本质上就是特登建议,尽管使用稍微不同的语法(并且没有-E)。这将匹配字符串def以及该字符串两侧的任何非空白字符(非空白字符是不是空格或制表符的字符)。

或者,

tr '[:blank:]' '\n' <file | grep -F 'def'

这只是将行分成多行,每个空格分隔的单词一行(其中“空白”是制表符或空格字符)。然后,它在生成的行上应用纯字符串匹配grep -F来查找您感兴趣的行。


您的模式 ,\wdef\w对于 GNU grep,如果使用 POSIX 字符类名称,则与 相同[[:alnum:]_]def[[:alnum:]_],要求字符串def两侧各有一个字母数字字符或下划线。点既不是字母数字字符也不是下划线。

def如果该模式出现在行的开头或结尾,也不会匹配。

答案3

通过您的尝试,您无法匹配要返回的整个单词。标志仅返回-o定义grep的匹配正则表达式部分。也不\w是 POSIX 定义的扩展,grep并且可能仅在支持 PCRE 语法的 GNU 版本中可用。你可以做的

grep -oP '(\w*)def[.](\w*)'

-P标志打开 GNU 中的 PCRE 正则表达式模式grep,并且该-o标志返回与定义的正则表达式匹配的整个单词。正则表达式被翻译为匹配零个或多个字母数字字符,后跟def一个文字.(括在括号表达式中),后跟零个或多个字母数字字符。

下面将使用 POSIX 字符类来表示字母数字字符。但请记住该标志-o仍然是 GNU 扩展

grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)' 

相关内容