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
) .