sed 's/\\/& /g;s/\n/\
/g; s/\\ /\\/g' <in >out
... deve manipular as substituições de ewline \n sem interpretar erroneamente escapes de barra invertida - assim você ainda pode ter uma entrada literal \n in. Estou um pouco confuso sobre como você pode obter um \n de seus comandos de histórico, no entanto.
Eu tentei w / zsh para descobrir como um \n ewline pode ser lido do arquivo de histórico sem ter escapado assim:
echo '
\n'
history -1
11355 echo '\n\n'
Isso não serve. Então, tentei isso:
hist(){ ! cat "$1"; }
echo '
\n'
FCEDIT=hist fc -1
echo '
\n'
... então provavelmente é isso que você deveria estar fazendo
Por algum motivo, zsh escapes \n ewlines em history or fc -l output de uma maneira ambígua, mas quando passa um comando de histórico para algum editor, ele dá a realidade.
zsh do history é fc , e o comando history não é muito mais do que um alias para fc -l . Quando fc é chamado com a opção -l , ele listará as linhas do histórico correspondente para stdout (depois de escapar ambiguamente de qualquer caractere não imprimível) , mas o comportamento padrão de fc é invocar outro utilitário com um ou mais argumentos de arquivo temporário nos quais ele gravou todas as correspondências de histórico para seus argumentos.
fc deriva o nome do utilitário que invoca da variável de ambiente $FCEDIT ou, se não estiver definido ou nulo, de $EDITOR ou, se não for bem-sucedido, será padronizado como vi . Se o utilitário chamado retornar true, fc tentará executar os comandos encontrados nos arquivos temporários editados (presumivelmente) antes de removê-los.
E assim a seqüência de comandos acima substitui cat para qualquer comando editor e inverte seu retorno para que uma leitura bem-sucedida dos arquivos temporários fc retorne false - para evitar que fc tente executar os comandos novamente .
Uma solução alternativa mais completa, que não precisa chamar um utilitário externo, seria:
history()
case $1 in
(*/*) ! while [ -r "$1" ]
do while read -rE RTN
do :; done <$1
shift; done;;
(*) local RTN=1 IFS=
FCEDIT=history fc "$@"
return $((RTN*$?))
esac
... que deve manipular quase transparentemente qualquer lista de argumentos que você possa esperar que o comando zsh ' history faça; exceto que sua saída é sempre literal e nunca inclui registros de data e hora do histórico ou números de eventos na saída (a menos que você chame como history -l [args] , caso em que se comportará como history ) .