使用sed将for循环中第n个出现的字符串替换为文件中的for循环

时间:2019-05-08 07:39:31

标签: bash sed

我正在尝试用以下文件中的Nbu替换第(j + 1)个出现的“ Nb”:

Nb  Nbc blahblahblah
Nb  blablablaNbblabla
Cd  Nb
and many lines that follow

其中j是for循环中的变量。

我想要得到的是这样的东西。例如,当j = 1时:

Nb  Nbc blahblahblah
Nbu blablablaNbblabla
Cd  Nb
and many lines that follow

我现在拥有的代码如下所示:

for j in $(seq 1 1 4)
do
sed -i ':a;N;$!ba;s/Nb /Nbu/$((j+1))' file
done

但是,我收到一条错误消息:

sed: -e expression #1, char 21: unknown option to `s'

问题似乎来自$((j + 1)),因为当我将代码更改为

sed -i ':a;N;$!ba;s/Nb /Nbu/2' file

我得到j = 1的期望输出。

包含循环j的语法应该是什么?

2 个答案:

答案 0 :(得分:2)

sed脚本周围的单引号防止变量扩展。您期望有一个数字,但sed看到一个“ $”。无效s

中断引号,允许变量扩展

 sed -i ':a;N;$!ba;s/Nb /Nbu/'$((j+1)) file

答案 1 :(得分:0)

这里是使用GNU awk和gensub的一个:

$ awk -v j=1 -v RS="" '{print gensub(/Nb /,"Nbu",j+1)}' file
Nb  Nbc blahblahblah
Nbu blablablaNbblabla
Cd  Nb
and many lines that follow

如果文本中有多个段落,则使用awk -v RS="^$"