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
我正在尝试使用 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