Eu tenho uma string que contém caracteres de nova linha. Quero escapar de todas as novas linhas nessa sequência, substituindo todos os caracteres de nova linha por uma sequência de dois caracteres: "\n". Como posso fazer isso no POSIX sh?
Aqui está o objetivo:
$ printf 'a\nb\nc\nd' | escape_newlines | od -a
0000000 a \ n b \ n c \ n d
141 134 156 142 134 156 143 134 156 144
0000012
Como posso definir escape_newlines
?
Métodos que tentei:
tr
— Problema: não é possível converter um único caractere em vários caracteres.awk 'BEGIN{ORS="\\n"} {print}'
— Problema: sempre insere a string de dois caracteres "\n" no final da string, mesmo que a string não termine com um caractere de nova linha. Exemplo:$ printf 'hi\n' | awk 'BEGIN{ORS="\\n"} {print}' | od -ab 0000000 h i \ n 150 151 134 156 0000004 $ printf 'hi' | awk 'BEGIN{ORS="\\n"} {print}' | od -ab 0000000 h i \ n 150 151 134 156 0000004
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g'
— Problema: se houver um caractere de nova linha no final da string, ele não será convertido. Exemplo:$ printf 'h\ni' | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g' | od -ab 0000000 h \ n i 150 134 156 151 0000004 $ printf 'h\ni\n' | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g' | od -ab 0000000 h \ n i nl 150 134 156 151 012 0000005