awk 命令用变量内容替换两个标签之间的块

问题描述 投票:0回答:1

我在堆栈溢出/交换上看到了这个问题的许多变体,但它们似乎都没有完全解决我正在寻找的问题。

我有一个如下所示的文件:

bla
bla
bla
tag
text 1
text 2
tag
bla
bla

我有一个变量(称之为 X),其中包含

alpha
beta
gamma

我正在寻找一个 awk (或 sed)表达式,它删除两个“标记”行之间的文本并将其替换为变量 X 的内容。最终结果应该是:

bla
bla
bla
tag
alpha
beta
gamma
tag
bla
bla

我想我需要做这样的事情:

awk -v var="$X" 'BEGIN{RS=""; FS="\n"} /tag/ {print var; next} {print $0"\n"}'

但这会删除标签并注入 $X 的两个副本

awk sed
1个回答
0
投票

这是一种方法。

awk -v var="$X" '/tag/ && !p {
    print; print var; p=1; next}
  /tag/ {p=0} !p'

这消除了对 Awk 内部变量的烦人操作,而是使用一个简单的状态变量

p
,当您不想简单地打印当前行时,该变量在范围内为 true。第一次看到
tag
时,也打印变量,并将
p
设置为 1。下次,再次关闭
p

演示:https://ideone.com/pFvU1B

© www.soinside.com 2019 - 2024. All rights reserved.