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

标签 bash sed

我正在尝试将文件中第 (j+1) 次出现的“Nb”替换为 Nbu,如下所示:

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 的语法应该是什么?

最佳答案

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

分解引用的部分以允许变量扩展

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

关于bash - 使用 sed 将文件中 for 循环中第 n 次出现的字符串替换为另一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56035791/

相关文章:

linux - 带有反引号的变量内部的bash转义感叹号

bash - bash中的冒号破折号 ":-"是什么意思

regex - 使用正则表达式捕获多行字符串并将其替换为自身,在每一行缩进

windows - 在 WebStorm 终端中使用 bash

bash - 将 "#"、 "$"、 "%"、 "&"和 "_"替换为 "\#"、 "\$"、 "\%"、 "\&"和 "\_"以及 0x104567910 和 0x104567910

c++ - strtok、char** 和内存

linux - 如何在找到匹配后替换一段代码 | Linux |

linux - 递归搜索具有给定名称替换单词的所有文件

xml - 使用 sed、awk、cat 或 grep 将 xml 中的 url 通过管道传输到 Linux 中的单独文件中

shell - "grep"从一行的最后 24 个字符中的前 12 个字符