Este é um caso de uso perfeito para ex , a ferramenta de escolha especificada pelo POSIX para edição de arquivos.
(Se você já usou vi , provavelmente já está familiarizado com ex , já que tudo que você digita em vi , que começa com dois pontos : é um comando ex . ex é o predecessor de vi .)
printf %s\n 'g/NAME#AAAA/ /AGE/t- | s/^/#/ | /AGE/s/.*/AGE NIL/' x | ex input.txt
Se você quiser testá-lo antes de salvar o arquivo, altere o% finalx antes do símbolo de pipe para %p e o arquivo modificado não será salvo, mas a versão modificada será impressa em stdout . Então aqui está o comando testing:
printf %s\n 'g/NAME#AAAA/ /AGE/t- | s/^/#/ | /AGE/s/.*/AGE NIL/' %p | ex input.txt
Explicação:
printf %s\n fornece uma maneira fácil de alimentar vários comandos para ex com uma nova linha após cada.
g/regex/ é o comando global; ele executa os comandos que seguem (até a próxima nova linha) em cada linha que corresponde à regex dada.
/AGE/t- copia a próxima linha que corresponde ao padrão /AGE/ para uma posição imediatamente anterior à linha atual (que é a NAME#AAAA line). Também move o cursor para a nova cópia da linha (de modo que agora se torna a "linha atual").
| é um separador de comando em ex .
s/^/#/ prefixam a linha AGE copiada com uma hashtag. (Ou um sinal de libra, dependendo do seu dialeto.);)
O próximo comando realmente tem duas partes: /AGE/ é o endereço, o que faz este comando operar na próxima linha que contém esse padrão, e s/.*/AGE NIL/ substitui qualquer linha, com AGE NIL .
x salva as alterações no arquivo e sai.
Invertendo as alterações
Para reverter as alterações, eu faria o seguinte:
printf %s\n 'g/NAME#AAAA/ ?^#AGE? m /^AGE/ | s/^#// | -d' %p | ex input.txt
Então, quando a alteração foi verificada, salve as alterações com:
printf %s\n 'g/NAME#AAAA/ ?^#AGE? m /^AGE/ | s/^#// | -d' x | ex input.txt
Explicação:
Comando global como antes.
Pegue a linha que começa com #AGE de antes da linha NAME, mova-a após a próxima linha que começa com AGE .
Remova o primeiro # .
Exclua a linha imediatamente anterior com -d (que é a linha de idade do NIL).
Imprima ou salve as alterações.