bash: 使用 gawk 在模式后插入一行

bash: insert a line after a pattern using gawk

我正在尝试使用 gawk 在模式后插入一行。 比方说,文件 aa 包含

11
22
33
11
22
33

我使用 gawk 仅在前 22 之后插入 222,即插入后,我的 aa 文件将包含:

11
22
222
33
11
22
33

但是,如果我使用:

 gawk -v nm=222 '/22/ {if (done++ == 0) print;print nm;next}1' aa

文件 aa 包含:

11
22
222
33
11
222
33

(我不想用 222 第二次替换 22,并且希望按原样保留 22,不再插入,即,在第一个 22 之后仅插入一次 222。 请帮忙。

改用此代码:

gawk -v nm=222 '/22/ {if (done++ == 0){print;print nm;next}};1' aa

如果值 22 在变量中:在 awk 中你不能使用 /constantRegex/,
你需要使用 ~ :

sel=22
gawk -v nm=222 -v sel="$sel" '([=11=]~sel) {if (done++ == 0){print;print nm;next}};1' aa
$ awk '1; ==nm2 && !a++ {print nm1}' nm1=222 nm2=22 file
11
22
222
33
11
22
33

解释:

$ cat script.awk
1                    # print the line
==nm2 && !a++ {    # if  is exactly the desired and a counter hasn't been touched yet 
    print nm1        # print parameter nm2
}

你可以使用这个:

awk '/^22$/ && !f {f=1; print; print "222"; next} 1' aa.txt

我正在检查一行是否仅包含 22 以及标志 f 是否未设置。在那种情况下,我将标志设置为 1,打印当前行和 222