我在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 ($1 ~ /^e/) {print $1} }' test.txt
但是这会打印每个字符e
的第一个单词。
输出
line
second
another
end
double
yet
当我想匹配单词的结尾工作正常。
匹配以d
结尾的每个第一个单词。
awk '{ if ($1 ~ /d$/) {print $1} }' test.txt
输出
second
end
知道为什么第一个例子匹配单词的开头不起作用?
我在那里做错了什么?
答案 0 :(得分:1)
这与gawk它的Windows引用规则无关。 gawk甚至没有看到引号 - 它只是在Windows传递给它的任何脚本(即引号之间的部分)上运行,而它完全是Windows解释引号以隔离它随后传递给的脚本GAWK。标准建议是避免问题是将awk脚本放在一个文件中并以awk -f script
运行,而不是试图处理Windows引用的噩梦。但最好的建议是在Windows上运行cygwin。
答案 1 :(得分:0)
我刚刚在Windows 10上使用gawk 3.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代码。
答案 2 :(得分:0)
awk“ {if($ 1〜/ ^^ e /){print $ 1}}” test.txt
在Windows平台上的: 1-与“交换”,反之亦然 2-为^使用^^