awk正则表达式模式与行的开头

时间:2017-06-11 22:00:02

标签: regex windows pattern-matching gawk

我在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

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

3 个答案:

答案 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-为^使用^^