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

时间:2014-05-06 09:26:42

标签: regex macos bash awk

尝试在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。但是他们都没有给我预期的结果。

由于

4 个答案:

答案 0 :(得分:3)

如果始终位于第2位,您可以使用:

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}}'
$

答案 1 :(得分:3)

你可以使用这样的正则表达式:

$> 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上通过gnu-awk安装了homebrew并使用我可以执行的操作:

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

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

答案 2 :(得分:1)

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

$ 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:]_更改为您的定义,如果不是那样。

答案 3 :(得分:0)

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

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

注意开头的空格&amp;输入结束&amp;图案。
这里,解析器(本例中为grep)不需要正则表达式支持。即使C的标准函数strstr也可以匹配此...