我正在尝试用以下文件中的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的语法应该是什么?
答案 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="^$"
。