Trabalhando em uma questão para codegolf.se , tentando fazer uma simples substituição de texto.
- Dado um arquivo
coin.txt
contendo 1 palavra,heads
outails
- Tenho um
ed
scriptflip.ed
da seguinte forma:
s/heads/1/n\
s/tails/-1/n\
wq
.
- Então eu executo a partir do terminal (macos, zsh), da seguinte forma: (por " Ed Mastery ", capítulo 111)
[~/golf/ed]λ ed coin.txt < flip.ed; cat coin.txt 6 ? caudas
Esperava que o script fosse alterado tails
para -1
. Eu recebo o mesmo problema do BSD e GNU ed ( /bin/ed
e /usr/local/bin/ged
, e TIO.run para esse assunto). Nenhum parece capaz de executar várias substituições.
Aqui está um exemplo no TIO.run , acho que está rodando GNU ed.
Há algum problema no meu ed
script? Ou é um bug no poderoso ed
??
Atualizar
Uma solução, cortesia de @ed1conf no twitter. Usa g
prefixo para fazer a substituição apenas nas linhas correspondentes, evitando assim erros que quebraram meu script original. Experimente on-line!
g/heads/s//1/
g/tails/s//-1/
wq
.
Você pode fazer isso, mas não pode enviar os comandos via redirecionamento ou um arquivo normal.
Do manual online GNU ed :
Um dos dois comandos falhará, pois a palavra no arquivo não pode corresponder a ambos os padrões e, portanto,
ed
sai - seja na linha 1 porque não corresponde ou na linha 2 porque não corresponde (e, portanto, saindo antes o arquivo alterado é salvo).Os comandos funcionariam (menos as barras invertidas e sufixos) via stdin:
Você receberá um
?
para stderr porques/heads/1/
falhou (que você pode redirecionar), mas todas as substituições acontecem conforme o esperado.Observe que soltei o
.
comando à direita, pois oq
comando é suficiente para saired
.Uma solução alternativa, postada pela ed(1) Conference no Twitter , é:
ou, sem abreviaturas na
s///
parte:Essas variações funcionam porque os
g
comandos não falham, mesmo que nenhuma substituição seja realizada.Com
sed
, você poderia fazer isso comEm
ed
, ot
comando é um comando completamente diferente e não "ramifica se a substituição mais recente fez algo".Com GNU
ed
, você pode fazerpara fazer seu flip, mas pode não funcionar no BSD
ed
pois o processamento dos comandos para na primeira substituição que não corresponde, pois(que é do padrão POSIX )
Os erros que você obtém do GNU
ed
ao executar este script são erros "No match" (visíveis se você inserir oH
comando primeiro no script) e podem ser ignorados com segurança.