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.