简体   繁体   English

使用sed或awk在两个匹配模式之间插入行

[英]Insert lines between two matching patterns using sed or awk

I have lines in text.txt as follows 我在text.txt中有如下几行

start:xfedfgrrg
vfefvrgvr
efefrg
end: abc
end : xyz

start:ewef
feefvef
frrfer
end:ccbf


start:e3frrf
f2erv
frf
end: ece
end: d32d2d
end: fff

I want to add few lines (let's say hello world) everytime patten "end:" matches. 我想在每一次patten“ end:”匹配项中添加几行(比方说你好世界)。 But ignore following occurrence of pattern "end:" untill a "start:" pattern matches again. 但是,请忽略以下出现的模式“结束:”,直到再次匹配“开始:”模式。

Required Output 所需输出

start:xfedfgrrg
vfefvrgvr
efefrg
hello world
end: abc
end : xyz

start:ewef
feefvef
frrfer
hello world
end:ccbf


start:e3frrf
f2erv
frf
hello world
end: ece
end: d32d2d
end: fff

Awk oneliner: Awk oneliner:

awk '/start:/{on=1} on&&/end:/{print "hello world"; on=0} {print}' file

which uses a variable "on" to mark when we're between the start/end blocks. 它使用变量“ on”来标记我们在开始/结束块之间的时间。

$ sed '/start/{x;s/.*/./;x};/end/{x;/^.$/{x;s/^/hello world\n/;x};s/^/./;x}' filename
start:xfedfgrrg
vfefvrgvr
efefrg
hello world
end: abc
end : xyz

start:ewef
feefvef
frrfer
hello world
end:ccbf


start:e3frrf
f2erv
frf
hello world
end: ece
end: d32d2d
end: fff

Explanations : 说明

like this 像这样

if (/start/)
    HoldSpace = "."

if (/end/)
    if (HoldSpace == ".")  # just one /end/
        add "hello world\n" to first

    HoldSpace = HoldSpace + "."  # if two /end/; HoldSpace is ".."

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM