Sumary
Sintaxe GNU:
sed '/claudio/{s//claudia/;:p;n;bp}' file
Ou mesmo (para usar apenas uma vez a palavra a ser substituída:
sed '/\(claudi\)o/{s//\1a/;:p;n;bp}' file
Ou, na sintaxe POSIX:
sed -e '/claudio/{s//claudia/;:p' -e 'n;bp' -e '}' file
funciona em qualquer sed, processa apenas quantas linhas claudio
forem necessárias para encontrar a primeira , funciona mesmo que claudio
esteja na primeira linha e é mais curto, pois usa apenas uma sequência de expressões regulares.
Detalhe
Para alterar apenas uma linha, você precisa selecionar apenas uma linha.
O uso de 1,/claudio/
(da sua pergunta) seleciona:
- da primeira linha (incondicionalmente)
- para a próxima linha que contém a sequência
claudio
.
$ cat file
claudio 1
antonio 2
claudio 3
michele 4
$ sed -n '1,/claudio/{p}' file
claudio 1
antonio 2
claudio 3
Para selecionar qualquer linha que contenha claudio
, use:
$ sed -n `/claudio/{p}` file
claudio 1
claudio 3
E para selecionar apenas o primeiro claudio
no arquivo, use:
sed -n '/claudio/{p;q}' file
claudio 1
Em seguida, você pode fazer uma substituição somente nessa linha:
sed '/claudio/{s/claudio/claudia/;q}' file
claudia 1
O que alterará apenas a primeira ocorrência da correspondência de regex na linha, mesmo que possa haver mais de uma, na primeira linha que corresponda à regex.
Obviamente, a /claudio/
regex poderia ser simplificada para:
$ sed '/claudio/{s//claudia/;q}' file
claudia 1
E, então, a única coisa que falta é imprimir todas as outras linhas sem modificação:
sed '/claudio/{s//claudia/;:p;n;bp}' file
info sed
: (0,/REGEXP/
: Um número de linha de 0 pode ser usado em uma especificação de endereço como0,/REGEXP/
de modo quesed
vai tentar igualar REGEXP na primeira linha de entrada demasiado Em outras palavras,.0,/REGEXP/
É semelhante a1,/REGEXP/
, exceto que se o ADDR2 corresponder à primeira linha de entrada, o formulário 0, / REGEXP / considerará que ele encerra o intervalo, enquanto o formulário 1, / REGEXP / corresponderá ao início do seu intervalo e, portanto, aumentará o alcance. até a segunda ocorrência da expressão regular)