Grep 完整名称,包括模式中的点

Grep 完整名称,包括模式中的点

我想用点 grep 完整的单词。

就像我有文件一样test.txt

文件中的数据:

Abc  ABC.xyz abc ABC.xyz 
Def  DEF.mno def DEF.mno

当我使用时,grep -o我的输出低于

grep -o "\w*ABC\w*" test.txt

输出 :ABC

我想要完整的单词ABC.xyz

答案1

问题是这\w意味着“单词字符”([a-zA-Z0-9_])并且.从来不是单词的一部分:

 $ echo . | grep '\w'
 $ 

您可以只搜索非空白:

$ echo ABC.xyz | grep '\S*ABC\S*'
ABC.xyz

请注意,这\S可能不会被普遍理解。如果它在您的实现中不起作用,请改用grep -E

答案2

awk '/ABC/ { print $NF }' test.txt

这将用于awk将字符串ABC与每行的内容进行匹配。如果一行匹配,则输出最后一个空格分隔的单词。

如果您想匹配该行的第一个字段,请使用$1 ~ /Abc/而不是/ABC/。如果您想与第一个字段进行字符串比较,请使用$1 == "Abc"

要传递您在命令行上进行比较的字符串,请使用例如

awk -v str="Abc" '$1 == str { print $NF }' test.txt

要传递您在命令行上进行比较的模式,请使用例如

awk -v pat="ABC" '$1 ~ pat { print $NF }' test.txt

更改$1$0与整条线进行比较。


使用您自己的方法grep,并假设您不知道文件名后缀(如果是的话),使用 GNU grep

grep -o '\<ABC\.\w*\>' test.txt

匹配\<单词的开头,而\>匹配单词的结尾。

这会给你 ABC.txt不过,因为它在第一行出现了两次。

对于非 GNU 实现,grep您可以使用[_[:alnum:]]来代替\w(这也可以在 GNU 中工作grep)。

相关内容