我刚刚注意到 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
的单词?
取决于您想对比赛做什么,但这可能就足够了:
$ 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
如果您安装了 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*