Как заменить n-ое вхождение строки с помощью sed

Есть ли способ заменить n-ое вхождение строки в файл с помощью sed?

Я использую sed -i '0,/jack.*/ s//jill/', чтобы заменить первое вхождение.

Как я могу изменить его так, чтобы он заменил n-ое вхождение?

Мой файл содержит следующие строки:

first line
second line
third line
jack=1
fifth line
jack=
seventh line

Я не знаю значения после jack=, это может быть что угодно или ничего.

Я хочу заменить второе вхождение jack= и все, что следует за ним, с помощью jill.

Ответы

Ответ 1

Сначала замените все символы новой строки уникальным символом, который не встречается нигде в вашем файле (например, ^), используя tr. Вам нужно сделать это, чтобы создать одну строку для sed. Затем передайте его sed и скажите ему заменить n-е вхождение вашей строки. Наконец, передайте результат обратно через tr, чтобы воссоздать новые строки.

При n = 2 команда:

$ tr '\n' '^' < file | sed 's/jack/jill/2' | tr '^' '\n'
first line
second line
third line
jack
fifth line
jill
seventh line

Update:

Это также можно сделать с помощью sed, не меняя сначала новые строки, используя следующую команду:

$ sed ':a;N;$!ba;s/jack/jill/2' file

В качестве альтернативы используйте awk:

$ awk '/jack/{c+=1}{if(c==2){sub("jack","jill",$0)};print}' file