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