在ksh
shell 脚本中,我使用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 -o
POSIX 字符类:
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:]]*\)'