匹配正则表达式后打印行

时间:2013-06-11 20:38:00

标签: regex sed awk gawk

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

有什么想法吗?

6 个答案:

答案 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(没有地址范围,只有一个条件):

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$