Se eu tiver uma sequência com caracteres não imprimíveis, novas linhas ou tabulações, existe uma maneira echo
de imprimir essa sequência e mostrar códigos para esses caracteres (por exemplo, \n
para nova linha, \b
para backspace)?
13
e- ohce
* rimshot *printf '%q' "$str"
imprimirá a string escapada. Não estou adicionando isso como resposta, já que não é a mesma forma de escape queecho -e
usa - em vez disso, destina-se a ser segura para avaliação - mas (1) é boa o suficiente se seu objetivo é a legibilidade humana, (2) é bom o suficiente se seu objetivo for a geração segura de shell e (3)echo -e
for mal e errado de qualquer maneira (se você ler as especificações do POSIX, verá que printf é a maneira preferida de formatar a sequência de caracteres eecho -e
não é garantido pelo POSIX da linha de base em todos).Respostas:
Existem várias maneiras de fazer isso. Os dois mais portáteis que eu conheço são
sed
eod
- ambos são POSIX.Gosta de ...
read
estilo escapa - estilo C.RESULTADO
od
é um pouco mais configurável ...Se você quiser saber em que todas essas opções você pode procurar
man od
, mas especifiquei que quero dois tipos de escapes - a-t c
barra invertida e os-t a
caracteres nomeados. A-w
opção usada acima não é especificada pelo POSIX.E aqui está uma pequena função de shell que imprimirá de maneira portável os valores octais de cada byte em seus argumentos - os quais, é claro,
od
podem lidar também com-t o
:Essa é simples. Isso é um pouco mais complicado.
printf -q
Porém, ele deve poder fazer o que as implementações específicas do shell podem fazer.Usando a sequência de exemplo anterior com um pouco mais:
RESULTADO
É apenas um pouco diferente. Você pode notar que há
0
um\b
ackslash extra e um extra . Isso permite uma tradução fácil para umread
ou um%b
printf
argumento. Por exemplo:RESULTADO
fonte
proctal
?bsq()
- está faltando alguma coisa? Eu pergunto porque não estou totalmente confiante sobre as barras invertidas.Quando você remove a
-e
opção paraecho
, inbash
e desde que axpg_echo
opção não tenha sido ativada, ela deve imprimir as seqüências como nada mais que o texto original. Então,\n
e\t
apareceria literalmente isso.Exemplo
Você também pode usar o
printf
comando interno deksh93
,zsh
oubash
para finagle isso também.(
trecho debash
saída mostrada acima. Existem algumas variações dependendo do shell).help printf
embash
fonte
printf %q
que trunca os\n
s finais , é a$()
captura de saída que os tira.printf
dentro de um subshell para capturar sua saída é bobo, poisprintf -v varname
colocará a saída diretamente em uma variável, sem subshell envolvido.printf
em um subshell, estavaecho
em um, puramente para demonstrar que você pode pegar a saída de caractere especialecho
e convertê-la novamente na notação de escape.Você poderia usar algo como,
Agora, você pode fazer algo como,
Resultado
Outro teste geral sem nenhum arquivo é como,
O comando acima produz a saída como,
Referências
fonte
Com
zsh
, há o(q)
,(qq)
,(qqq)
,(qqqq)
bandeiras expansão de variáveis que podem citar as variáveis de várias maneiras:No seu caso, você provavelmente desejaria um dos dois últimos.
fonte
od -c
normalmente imprimirá caracteres normais, mas caracteres especiais (tabulação, nova linha etc.) e caracteres não imprimíveis comoprintf
código de escape.Então:
O
-An
dizod
para não emitir o endereço.fonte
Use o
printf
comando Por exemplo:printf "Hello\nthis is my line
irá produzir
fonte
echo -e
, estou procurando o inverso .