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



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

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

测试.txt

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

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

我正在使用的awk命令是:

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

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

输出

line
second
another
end
double 
yet

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

awk '{ if ($1 ~ /d$/) {print $1} }' test.txt

输出

second
end

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

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

我刚刚在 Windows 3.1.6 上使用 gawk 1.6 - 1 尝试了它。

当我尝试使用单引号时,它会给出语法错误:

awk '{ if ($1 ~ /^e/) {print $1} }' test.txt
//  Error
awk: '{
awk: ^ invalid char ''' in expression

双引号工作正常,仅打印end.

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

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

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

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

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