mawk 程序既不理解单词边界标记:“\<", "\>”也不理解其他转义序列

问题描述 投票:0回答:2

我刚刚注意到 Ubuntu 默认没有安装

gawk
的新安装。

因此,我所有包含单词边框标记的 awk 表达式:“<", ">”根本不起作用,例如:

$ readlink -e $(which awk)
/usr/bin/mawk
$ echo "word1 Bluetooth word3" | awk '/\<Bluetooth\>/'
$

EDIT0:在安装了

gawk
的另一个系统上,它可以工作:

$ readlink -e $(which awk)
/usr/bin/gawk
$ echo "word1 Bluetooth word3" | awk '/\<Bluetooth\>/'
word1 Bluetooth word3
$

编辑1:此外

mawk
表现出奇怪的行为:

$ echo word1 word2 word3   | mawk '/^\w+/{print$1}'
word1
$ echo sebastien1 abc toto | mawk '/^\w+/{print$1}'

以下是一些转义序列

gawk
理解:

$ man gawk | grep '\\[yswSW<>].*Matches' 
   \y         Matches the empty string at either the beginning  or  the
   \<         Matches the empty string at the beginning of a word.
   \>         Matches the empty string at the end of a word.
   \s         Matches any whitespace character.
   \S         Matches any nonwhitespace character.
   \w         Matches any word-constituent character (letter, digit, or
   \W         Matches any character that is not word-constituent.

编辑2:

Ed Morton
是对的,
mawk
不理解
\w
,也不理解
gawk
理解的其他空格序列:

$ man mawk | grep '\\[yswSW<>]' 
$

有没有一种方法可以匹配适用于

mawk
gawk
的单词?

awk
2个回答
2
投票

取决于您想对比赛做什么,但这可能就足够了:

$ echo "word1 Bluetooth word3" | awk '/(^|[^[:alnum:]_])Bluetooth([^[:alnum:]_]|$)/'
word1 Bluetooth word3

在所有 awks 中,甚至仅在 POSIX awks 中,不存在表示“字边界”的通用转义序列。

如果这不是您需要的全部,请编辑您的问题以更好地解释您想要如何处理匹配字符串,并提供演示该用法的示例输入/输出。

关于您的编辑 - mawk 没有表现出奇怪的行为。您要求它找到以 1 个或多个

w
开头的行(
w
是文字字符,
\w
也仍然是相同的文字字符)并打印该行的第一个字段。您测试的第一行以
w
开头,第二行则不是。

如果您尝试匹配单词组成字符(这就是

\w+
在 gawk 中所做的),则在 POSIX awk 中使用
[[:alnum:]_]+
或在任何 awk 中使用
[a-zA-Z0-9_]+
,假设这些字符范围对于您的语言环境是正确的。如果您想打印与该正则表达式匹配的单词,那么它是:

$ echo 'sebastien1 abc toto' |
    awk 'match($0,/^[[:alnum:]_]+/){print substr($0,RSTART,RLENGTH)}'
sebastien1

0
投票

如果您安装了 gawk,awk 将指向 gawk 而不是 mawk,因此您的 awk 程序将正常工作...但其他程序可能不会:-(

$ whereis awk
awk: /usr/bin/awk /usr/lib/x86_64-linux-gnu/awk /usr/share/awk /usr/share/man/man1/awk.1.gz
$ ll /usr/bin/awk
lrwxrwxrwx 1 root root 21 mar  8  2023 /usr/bin/awk -> /etc/alternatives/awk*
$ ll /etc/alternatives/awk
lrwxrwxrwx 1 root root 13 gru 10 12:01 /etc/alternatives/awk -> /usr/bin/gawk*
© www.soinside.com 2019 - 2024. All rights reserved.