Sumary
Синтаксис GNU:
sed '/claudio/{s//claudia/;:p;n;bp}' file
Или даже (использовать только один раз слово для замены:
sed '/\(claudi\)o/{s//\1a/;:p;n;bp}' file
Или в синтаксисе POSIX:
sed -e '/claudio/{s//claudia/;:p' -e 'n;bp' -e '}' file
работает с любым sed, обрабатывает только столько строк, сколько необходимо, чтобы найти первую claudio, работает, даже если claudioнаходится в первой строке и короче, так как использует только одну строку регулярного выражения.
подробность
Чтобы изменить только одну строку, вам нужно выбрать только одну строку.
Используя 1,/claudio/(из вашего вопроса) выбирает:
- с первой строки (безоговорочно)
- на следующую строку, которая содержит строку
claudio.
$ cat file
claudio 1
antonio 2
claudio 3
michele 4
$ sed -n '1,/claudio/{p}' file
claudio 1
antonio 2
claudio 3
Чтобы выбрать любую строку claudio, используйте:
$ sed -n `/claudio/{p}` file
claudio 1
claudio 3
И чтобы выбрать только первое claudio в файле, используйте:
sed -n '/claudio/{p;q}' file
claudio 1
Затем вы можете сделать замену только в этой строке:
sed '/claudio/{s/claudio/claudia/;q}' file
claudia 1
Что изменит только первое вхождение совпадения с регулярным выражением в строке, даже если их может быть больше, чем в первой строке, соответствующей регулярному выражению.
Конечно, /claudio/регулярное выражение может быть упрощено до:
$ sed '/claudio/{s//claudia/;q}' file
claudia 1
И затем, единственное, чего не хватает, это напечатать все остальные строки без изменений:
sed '/claudio/{s//claudia/;:p;n;bp}' file
info sed: (0,/REGEXP/: В спецификации адреса можно использовать номер строки, равный 0,0,/REGEXP/так чтоsedон также попытается сопоставить REGEXP в первой строке ввода. Другими словами,0,/REGEXP/это аналогично1,/REGEXP/, за исключением того, что если ADDR2 совпадает с самой первой строкой ввода, форма 0, / REGEXP / будет считать его завершающим диапазон, тогда как форма 1, / REGEXP / будет соответствовать началу диапазона и, следовательно, составит диапазон диапазона. до второго появления регулярного выражения)