Sumaryczny
Składnia GNU:
sed '/claudio/{s//claudia/;:p;n;bp}' file
Lub nawet (użyć tylko jednego słowa, które ma zostać zastąpione:
sed '/\(claudi\)o/{s//\1a/;:p;n;bp}' file
Lub w składni POSIX:
sed -e '/claudio/{s//claudia/;:p' -e 'n;bp' -e '}' file
działa na każdym sed, przetwarza tylko tyle wierszy, ile potrzeba do znalezienia pierwszego claudio
, działa nawet, jeśli claudio
znajduje się w pierwszym wierszu i jest krótszy, ponieważ używa tylko jednego ciągu wyrażeń regularnych.
Szczegół
Aby zmienić tylko jedną linię , musisz wybrać tylko jedną linię.
Użycie 1,/claudio/
(z twojego pytania) wybiera:
- z pierwszej linii (bezwarunkowo)
- do następnego wiersza zawierającego ciąg
claudio
.
$ cat file
claudio 1
antonio 2
claudio 3
michele 4
$ sed -n '1,/claudio/{p}' file
claudio 1
antonio 2
claudio 3
Aby wybrać dowolny wiersz, który zawiera claudio
:
$ sed -n `/claudio/{p}` file
claudio 1
claudio 3
Aby wybrać tylko pierwszy claudio
plik, użyj:
sed -n '/claudio/{p;q}' file
claudio 1
Następnie możesz dokonać podstawienia tylko w tym wierszu:
sed '/claudio/{s/claudio/claudia/;q}' file
claudia 1
Który zmieni tylko pierwsze wystąpienie dopasowania wyrażenia regularnego w linii, nawet jeśli może być więcej niż jeden, w pierwszym wierszu, który pasuje do wyrażenia regularnego.
Oczywiście /claudio/
wyrażenie regularne można uprościć w celu:
$ sed '/claudio/{s//claudia/;q}' file
claudia 1
A zatem jedyne, czego brakuje, to wydrukowanie wszystkich pozostałych wierszy niezmodyfikowanych:
sed '/claudio/{s//claudia/;:p;n;bp}' file
info sed
: (0,/REGEXP/
: Numer linii 0 może być użyty w specyfikacji adresu,0,/REGEXP/
tak abysed
próbował dopasować REGEXP również w pierwszej linii wejściowej. Innymi słowy,0,/REGEXP/
jest podobnie1,/REGEXP/
, z tym wyjątkiem, że jeśli ADDR2 pasuje do pierwszego wiersza wejścia, formularz 0, / REGEXP / uzna, że kończy on zakres, podczas gdy formularz 1, / REGEXP / dopasuje początek jego zakresu i tym samym zwiększy zakres zakresu aż do drugiego wystąpienia wyrażenia regularnego)