我在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- 用于 ^ 使用 ^^