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
.