awk 正则表达式模式与行首不匹配

awk regex pattern does not match beginning of the line

我在 Windows 10,MinGW 安装上使用 GNU awk 版本 3.1.7。

要测试的文件具有此内容,但其他文件也有相同的行为。

test.txt

line one
second line
another line
end this one should match
double test
yet another

我只想打印以 e 开头的第一个单词。

我使用的 awk 命令是:

awk '{ if ( ~ /^e/) {print } }' test.txt

但是这会在任何地方打印每个第一个带有字符 e 的单词。

输出

line
second
another
end
double 
yet

当我想匹配单词的结尾时工作正常。
匹配第一个以 d.

结尾的单词
awk '{ if ( ~ /d$/) {print } }' test.txt

输出

second
end

知道为什么第一个匹配单词开头的示例不起作用吗?
我在那里做错了什么?

我刚刚在 Windows 10.

上用 gawk 3.1.6 - 1 试了一下

当我尝试使用单引号时出现语法错误:

awk '{ if ( ~ /^e/) {print } }' test.txt

//  Error
awk: '{
awk: ^ invalid char ''' in expression

使用双引号可以正常工作,仅打印 end.

awk "{ if ( ~ /^e/) {print } }" test.txt

所以我也在 gawk 3.1.7 上用双引号尝试了这一行。
有效。
仅打印 end.
当我使用带单引号的行示例时,gawk 3.1.7 没有给出任何错误,但是由于某种原因,其中的 /^e/ 正则表达式不匹配,因为它应该匹配。

所以至少从我的角度来看,如果您在 windows 上使用 gawk,请始终在命令行中对 awk 代码使用双引号。

这与 gawk 无关,它是 Windows 引用规则。 gawk 甚至看不到引号 - 它只是 运行s 在 Windows 传递给它的任何脚本上(即引号之间的部分)并且它完全是 Windows 解释引号以隔离然后传递给 gawk 的脚本。标准建议是通过将 awk 脚本放入文件中并将 运行ning 作为 awk -f script 而不是尝试处理 Windows 引用噩梦来避免此问题。最好的建议是在 Windows.

之上 运行 cygwin

awk "{ if ($1 ~ /^^e/) {print $1} }" test.txt

在 Windows 平台上: 1- 将 " 与 ' 交换,反之亦然 2- 对于 ^ 使用 ^^