Como faço para usar um substituto de nova linha em um BSD sed?
Pergunta
Greetings, como faço para executar o seguinte em BSD sed?
sed 's/ /\n/g'
Do homem páginas afirma que \ n será tratado literalmente dentro de uma cadeia de substituição, como faço para evitar esse comportamento? Existe uma alternativa?
Eu estou usando Mac OS Snow Leopard, eu posso instalar o Fink para obter GNU sed.
Solução
Em um shell, você pode fazer:
sed 's/ /\
/g'
bater a tecla enter após a barra invertida para inserir uma nova linha.
Outras dicas
Para facilidade de uso, eu, pessoalmente, muitas vezes usam
cr="\n"
# or (depending version and OS)
cr="
"
sed "s/ /\\${cr}/g"
para que fique em 1 linha.
Para expandir a resposta de @ sikmir: Em Bash, que é o shell padrão no Mac OS X, tudo que você precisa fazer é colocar um personagem $
na frente da string que contém a sequência de escape que você quer se interpretada. Bash irá traduzi-lo automaticamente para você.
Por exemplo, eu removidos todos os MS-DOS retornos de carro de todos os arquivos de origem em lib/
e include/
escrevendo:
grep -lr $'\r' lib include | xargs sed -i -e $'s/\r//'
find . -name '*-e' -delete
BSD grep
teria interpretado '\r'
corretamente por conta própria, mas usando $'\r'
não dói.
BSD sed
teria 's/\r//'
mal interpretado por conta própria, mas usando $'s/\r//'
, eu evitado essa armadilha.
Observe que podemos colocar $
na frente de toda a cadeia, e ele vai cuidar de todas as sequências de escape em toda a string.
$ echo $'hello\b\\world'
hell\world