Use ex
, o editor de arquivos especificado pelo POSIX (e o não-visual forma de vi
).
printf '%s\n' '/This is a unique line' '.,/Common/copy -' %p | ex file.txt
Imprime o conteúdo do arquivo modificado, mas não salva as alterações.
Aqui está o comando para salvar as alterações:
printf '%s\n' '/This is a unique line' '.,/Common/copy -' x | ex file.txt
Ao contrário de Awk e Sed, ex
não está limitado a apenas linhas modificadas em ordem. Em vez disso, ele pode operar em todo o buffer em vez de apenas avançar.
O primeiro comando /This is a unique line
é apenas um comando de movimento. Move o cursor para a primeira linha do arquivo que possui This is a unique line
.
O próximo comando é o comando copy
. Ele opera no intervalo de endereços da linha atual ( .
) até a linha seguinte, a partir da correspondência de Common
, e copia-os para a linha que precede a linha atual ( -
).
Atualização: para modificação após a cópia, vamos primeiro marcar a linha em que começamos. A primeira linha a ser copiada será marcada com "b" e a linha antes de ser marcada como "a". Então as linhas copiadas serão colocadas entre 'a e b', e podemos usá-las em endereços para nossos comandos "substitutos". E t
é sinônimo de copy
, a propósito.
printf "/Here is a unique line
kb
-ka
.,/Common/t 'a
'a+,'b-s/unique/changed/g
'a+,'b-s/some/different/g
x
" | ex file.txt