繁体   English   中英

在Mac OS X上将确切单词与awk匹配

[英]Match exact word with awk on Mac OS X

尝试在Mac OS X上使用awk。一个示例:

$ echo "abc stock def" | awk /stock/ 
abc stock def
$ echo "abc stockholder def" | awk /stock/
abc stockholder def

当我尝试将单词与awk完全匹配时遇到麻烦。 例如,在上述示例中,我只想匹配stock而不是stockholder 我尝试使用\\<\\>\\b\\y 但是,所有这些都没有给我预期的结果。

谢谢

如果始终处于第二位置,则可以使用:

awk '$2 == "stock"'

如果可以在任何位置,请使用:

awk '{for (i=1;i<=NF;i++) if ($i == "stock") {print; next}}'

参见示例:

$ echo "abc stock stock def" | awk '{for (i=1;i<=NF;i++) if ($i == "stock") {print; next}}'
abc stock stock def

$ echo "abc stockd def" | awk '{for (i=1;i<=NF;i++) if ($i == "stock") {print; next}}'
$

您可以像这样使用正则表达式:

$> echo "abc stock def" | awk '/(^| )stock( |$)/'
abc stock def

$> echo "abc restock def" | awk '/(^| )stock( |$)/'
$>

更新:要匹配除空间或起始/结束锚以外的其他边界,请使用此正则表达式:

$> echo "abc-stock-def" | awk '/[^[:alnum:]]stock[^[:alnum:]]/'
abc-stock-def

$> echo "abc-stocks-def" | awk '/[^[:alnum:]]stock[^[:alnum:]]/'
$> 

我还通过Mac上的homebrew安装了gnu-awk ,并可以使用该工具执行以下操作:

echo "abc stock def" | gawk '/\<stock\>/'
abc stock def

$> echo "abc restock def" | gawk '/\<stock\>/'
$>

单词成分字符的典型定义(例如\\w为GNU awk)是任何字母数字或下划线,因此:

$ cat file
abc stock def
abc stock. def
abc stockholder def
abc stock
stock def

$ awk '/(^|[^[:alnum:]_])stock([^[:alnum:]_]|$)/' file
abc stock def
abc stock. def
abc stock
stock def

如果不是,请将[:alnum:]_更改为您的定义。

我倾向于使用以下方法(也适用于不支持正则表达式的语言):

echo " abc stock def " | grep ' stock '
echo " stock abc def " | grep ' stock '
echo " abc def stock " | grep ' stock '

注意输入和模式的开头和结尾处的空格。
在这里,解析器(在此示例中为grep )不需要正则表达式支持。 甚至C的标准函数strstr也可以匹配此...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM