2

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

有任何想法吗?

4

6 回答 6

4

sed 的代码

sed '/end/a --' file
开始
富
酒吧
结尾
--
开始
foo2
酒吧2
结尾
--
开始
foo3
酒吧3
结尾
--
于 2013-06-11T21:23:20.973 回答
3

一个想法是检查范围何时结束并打印这些破折号。print因此,我通过具有该条件的显式默认值更改了隐式默认值:

awk '/start/,/end/ { print ( $0 ~ /end/ ) ? $0 "\n--" : $0 }' infile

它产生:

start
foo
bar
end
--
start
foo2
bar2
end
--
start
foo3
bar3
end
--
于 2013-06-11T20:48:44.073 回答
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
--
于 2013-06-12T13:50:28.693 回答
2

不使用地址范围:

awk 'NR>1 && $1=="start" {print "--"} 1'
于 2013-06-11T21:23:32.757 回答
2

awk(没有地址范围,只有一个条件):

awk '1;$0=="end" {print "--"}' file
于 2013-06-11T22:11:21.683 回答
1

awk '1;/^end$/{print "--"}' file

1无条件打印每一行。("如果表达式1为真,则执行默认操作,即print"。)
然后第二个模式打印--,但前提是该行匹配^end$

于 2013-06-12T00:49:15.043 回答