Você pode fazer:
sed -n '$d;w file2' >file1 <<IN
$(cat file1; echo .)
IN
Que gravará com segurança todas as linhas do arquivo1 no arquivo2, excluindo simultaneamente todas as linhas no arquivo1. O shell lida com o arquivo temporário intermediário de forma segura - ele cria um e depois o exclui do sistema de arquivos antes de gravar um único byte nele.
Assim que sed libera o descritor de arquivo (no EOF ou quando ele termina - o que ocorrer primeiro) , o arquivo deixa de existir. Ao contrário da opção comum sed -i , isso não depende de sed limpar depois de si mesmo (o que pode não acontecer se o processamento for inesperadamente interrompido) e não traz consigo as mesmas inconsistências de permissões a opção -i implica.
E o aplicativo não precisa ser global como demonstrado - as linhas podem ser excluídas do original e / ou gravadas seletivamente na saída separada ...
sed -n '$d;/pattern1/w file2
/pattern2/p' >file1 <<IN
$(cat file1; echo .)
IN
... demonstra como apenas as linhas do arquivo1 que correspondem a /pattern2/ serão impressas de volta no arquivo1 e apenas linhas do mesmo que correspondem a /pattern1/ são w ritten para arquivo2. Qualquer outro comando sed é obviamente aplicável também.
Vale a pena notar, porém, que para a maioria dos shells isso não carregará bytes NUL do arquivo1 (o que não é uma preocupação para sed work) - embora tal coisa é possível com zsh .