Замена n-го вхождения строки в цикле for в файле другой строкой с использованием sed - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь заменить (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?

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Одинарные кавычки вокруг сценария sed препятствуют расширению переменной.Вы ожидаете число, но sed видит '$'.Недопустимый флаг для s

Разбить цитируемый раздел, чтобы разрешить расширение переменной

 sed -i ':a;N;$!ba;s/Nb /Nbu/'$((j+1)) file
0 голосов
/ 08 мая 2019

Вот один из них, использующий 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="^$" - путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...