Arquivo:
1
2
3
4
1
5
6
7
4
Gostaria de procurar uma string, neste caso 1
, e depois alterar a próxima string 4
para 8
.
Saída esperada:
1
2
3
8
1
5
6
7
4
Eu tentei:
cat file | sed '/1/ s/4/8/'
Mas isso apenas procura uma string para mudar nessa linha.
Também não posso usar o número da linha para substituir no meu arquivo original porque pode haver um número diferente de linhas entre a primeira string e a segunda.
Eu não tenho GNU sed instalado.
O editor de arquivos especificado pelo POSIX,
ex
, é capaz de fazer exatamente isso.ex
é capaz de combinar vários endereços. So/1/
significa "Ir para" (ou referir-se a) "a próxima linha correspondente ao regex1
". Em seguida/4/
, vai dessa linha para a próxima linha correspondente4
. Es//8/
tem o significado usual; como em Sed, um regex em branco passado para os
comando significa "reutilizar o último regex usado", que neste caso é4
.Para imprimir o arquivo modificado, mas não salvar as alterações, use o seguinte comando:
Apenas para dar uma idéia melhor de vários endereços, o seguinte comando exclui a primeira linha que contém
cherry
antes da primeira linha que contémbanana
após a linha 27:x
significa salvar as alterações e sair e%p
significa "imprimir o arquivo inteiro". (%
é sinônimo de1,$
, que é um intervalo de endereços da primeira à última linha.)Para substituir apenas o 1º
PATTERN
que ocorre após umMARKER
, você pode fazer:Use um intervalo (do primeiro
MARKER
ao final do arquivo) e o buffer de espera. Cada vez que você encontrar uma linha correspondente,PATTERN
você troca os buffers e verifica se a linha que estava no espaço de espera também corresponde: se corresponder, troque de volta e vá para o final do script; caso contrário, sobrescreva com a linha atual e substitua.solução genérica usando
awk
, considere o seguinte arquivo de entrada modificado com vários1
s e4
sUse um sinalizador para indicar que
1
foi correspondido e um contador para saber qual bloco está sendo modificado. Limpar o sinalizador é necessário para iniciar o ciclo de correspondência novamentepode ser simplificado para alterar apenas o primeiro bloco
Awk
solução:A saída:
Com o awk é mais fácil e compatível com qualquer ocorrência Nth necessária
exemplo :
apenas o segundo 4 é alterado, mas não o primeiro nem o último.