Bash awk的正则表达式匹配模式可以放在操作行的左括号上方,还是必须放在同一行上?
我正在非常认真地研究Bash awk的正则表达式匹配模式可以放在操作行的左括号上方,还是必须放在同一行上?,bash,awk,Bash,Awk,我正在非常认真地研究awk来编写一个git-diff实现,它将显示git-diff的行号,我想确认是否有错[更新:我现在已经修复了维基百科页面的这一部分,但它以前是这么说的]: 可以将输出发送到以下文件: (pattern) { print "expression" > "file name" } /regex_pattern/ { print "expression" > "file name" } 或通过管道: (pattern) { print "exp
awk
来编写一个git-diff
实现,它将显示git-diff
的行号,我想确认是否有错[更新:我现在已经修复了维基百科页面的这一部分,但它以前是这么说的]:
可以将输出发送到以下文件:
(pattern)
{
print "expression" > "file name"
}
/regex_pattern/ {
print "expression" > "file name"
}
或通过管道:
(pattern)
{
print "expression" | "command"
}
/regex_pattern/ {
print "expression" | "command"
}
请注意,(图案)
位于开口撑杆上方。我很确定这是错误的,但在编辑页面之前需要确定。我认为该页面应该是这样的:
可以将输出发送到以下文件:
(pattern)
{
print "expression" > "file name"
}
/regex_pattern/ {
print "expression" > "file name"
}
或通过管道:
(pattern)
{
print "expression" | "command"
}
/regex_pattern/ {
print "expression" | "command"
}
这里有一个测试来“证明”它。我使用的是Linux Ubuntu 18.04
1。测试_awk.sh
gawk \
'
BEGIN
{
print "START OF AWK PROGRAM"
}
'
gawk \
'
BEGIN {
print "START OF AWK PROGRAM"
}
'
gawk \
'
/hey/
{
print $0
}
'
gawk \
'
/hey/ {
print $0
}
'
测试和错误输出:
$ echo -e "hey1\nhello\nhey2" | ./test_awk.sh
gawk: cmd. line:3: BEGIN blocks must have an action part
但有了这一点:
2。测试_awk.sh
gawk \
'
BEGIN
{
print "START OF AWK PROGRAM"
}
'
gawk \
'
BEGIN {
print "START OF AWK PROGRAM"
}
'
gawk \
'
/hey/
{
print $0
}
'
gawk \
'
/hey/ {
print $0
}
'
它很好用
$ echo -e "hey1\nhello\nhey2" | ./test_awk.sh
START OF AWK PROGRAM
另一个示例(未能提供预期输出):
3。测试_awk.sh
gawk \
'
BEGIN
{
print "START OF AWK PROGRAM"
}
'
gawk \
'
BEGIN {
print "START OF AWK PROGRAM"
}
'
gawk \
'
/hey/
{
print $0
}
'
gawk \
'
/hey/ {
print $0
}
'
错误输出:
$ echo -e "hey1\nhello\nhey2" | ./test_awk.sh
hey1
hey1
hello
hey2
hey2
但就像这样:
4。测试_awk.sh
gawk \
'
BEGIN
{
print "START OF AWK PROGRAM"
}
'
gawk \
'
BEGIN {
print "START OF AWK PROGRAM"
}
'
gawk \
'
/hey/
{
print $0
}
'
gawk \
'
/hey/ {
print $0
}
'
它按预期工作:
$ echo -e "hey1\nhello\nhey2" | ./test_awk.sh
hey1
hey2
更新:解决此问题后,我刚刚添加了以下部分: 学习材料:
awk
/gawk
的人都很有用awk
的全部目的就是编写git diffn
。我刚做完:您可以在示例中看到,可以用新行分隔语句,而不是语句末尾的分号。当你有
/regex/
{ ...
}
它相当于/regex/;{…}
这等于测试行为时的/regex/{print$0}{…}
请注意,
BEGIN
和END
是特殊的标记,它们需要显式的操作语句,因为forBEGIN
{print$0}
不能作为默认操作。这就是为什么开放的花括号应该在同一条线上。也许是因为方便,但这一切都是一致的。您可以在示例中看到,您可以用新行分隔语句末尾的分号,而不是分号。当你有
/regex/
{ ...
}
它相当于/regex/;{…}
这等于测试行为时的/regex/{print$0}{…}
请注意,
BEGIN
和END
是特殊的标记,它们需要显式的操作语句,因为forBEGIN
{print$0}
不能作为默认操作。这就是为什么开放的花括号应该在同一条线上。也许是因为方便,但都是一致的。我同意你的观点,维基百科页面是错误的。它就在awk手册中:
模式操作语句的形式为
pattern { action }
缺少{action}
表示打印该行;丢失的图案总是匹配的。模式操作语句由新行或分号分隔
语句以分号、换行符或右大括号结尾。
这是的手册页。GNU awk手册中也有同样的信息,只是埋藏得更深一些。美国呢
awk程序由以下形式的成对程序组成:
pattern { action }
可以省略模式或操作(包括括起来的大括号字符)
缺失模式应与任何输入记录相匹配,缺失动作应等同于:
{ print }
我同意你的观点,维基百科页面是错误的。它就在awk手册中: 模式操作语句的形式为
pattern { action }
缺少{action}
表示打印该行;丢失的图案总是匹配的。模式操作语句由新行或分号分隔
语句以分号、换行符或右大括号结尾。
这是的手册页。GNU awk手册中也有同样的信息,只是埋藏得更深一些。美国呢
awk程序由以下形式的成对程序组成:
pattern { action }
可以省略模式或操作(包括括起来的大括号字符)
缺失模式应与任何输入记录相匹配,缺失动作应等同于:
{ print }
如果你在谷歌上搜索了很多错误,比如维基百科页面有很多错误和缺失(大多数其他在线资源也是如此),忽略它,如果你想学习Awk,就去读阿诺德·罗宾斯的《有效的Awk编程》第四版。但是在所有情况下,任何时候你看到的
模式{action}
都应该是条件{action}
,因为,例如x==3
是一个条件,而不是“模式”。不,我很好。我完成了我需要完成的工作,我已经用awk
完成了一段时间。这就是我本周学习awk的目的:。此外,我建议人们,包括我自己,花时间尽可能地修复维基百科。不过,我会把这个工具放在未来的项目中,如果我需要的话,我可能会在将来研究这本书。话虽如此,我不知道,工作5天后,awk开始了30个小时,我觉得现在我可以胜任基本的工作了。再想一想,我可能听起来有点傲慢。我想让你知道:谢谢你的参考书。事实上,前几天我第一次看到你的评论时,我就把它加入了书签,并将其添加到我的亚马逊愿望列表中,以便我以后能找到它。我不认为学习awk的网络材料是不够的:我只是做了足够多的,让我对自己的成就感到满意。然而,你是对的:写得很好的嘘声