我是awk的新手并且坚持这个问题。基本上我正在寻找一个模式,我想用“ - ”分隔每个匹配,这样我就可以轻松地使用ruby中的yaml库来解析文件
awk '/(start)/,/(end)/' #awk command I am doing
我得到了什么:
start
foo
bar
end
start
foo2
bar2
end
start
foo3
bar3
end
我想要的是什么:
start
foo
bar
end
--
start
foo2
bar2
end
--
start
foo3
bar3
end
有什么想法吗?
答案 0 :(得分:4)
sed的代码
sed '/end/a --' file
start foo bar end -- start foo2 bar2 end -- start foo3 bar3 end --
答案 1 :(得分:3)
一个想法是检查范围何时结束并打印这些破折号。所以我用一个明确的默认值print
更改了隐含的默认值awk '/start/,/end/ { print ( $0 ~ /end/ ) ? $0 "\n--" : $0 }' infile
:
start
foo
bar
end
--
start
foo2
bar2
end
--
start
foo3
bar3
end
--
它产生:
{{1}}
答案 2 :(得分:2)
不使用地址范围:
awk 'NR>1 && $1=="start" {print "--"} 1'
答案 3 :(得分:2)
awk '1;$0=="end" {print "--"}' file
答案 4 :(得分:2)
使用/ start /,/ end /永远不是一个好主意,因为如果你想做一些简单的事情,比如在块之前/之后打印一行或排除包含开始/结束模式的行,它会引入重复的代码。请保持简单明了:
$ awk '/start/{f=1} f; f&&/end/{print "--";f=0}' file
start
foo
bar
end
--
start
foo2
bar2
end
--
start
foo3
bar3
end
--
答案 5 :(得分:1)
awk '1;/^end$/{print "--"}' file
1
无条件地打印每一行。 (“如果表达式1
为真,请执行默认操作,即print
”。)
然后第二个模式打印--
,但前提是该行匹配^end$