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 / будет соответствовать началу диапазона и, следовательно, составит диапазон диапазона. до второго появления регулярного выражения)