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