Si j'ai une chaîne avec des caractères non imprimables, de nouvelles lignes ou des tabulations, est-ce que je peux utiliser echo
pour imprimer cette chaîne et afficher les codes de ces caractères (par exemple, \n
pour la nouvelle ligne, \b
pour le retour arrière)?
13
e- ohce
* rimshot *printf '%q' "$str"
affichera la chaîne échappée. Je n'ajoute pas cela comme réponse car ce n'est pas la même forme d'échappement quiecho -e
utilise - plutôt, elle est destinée à être sécurisée par les évaluations - mais (1) c'est assez bon si votre objectif est la lisibilité humaine, (2) c'est assez bon si votre objectif est la génération de shell sécurisée, et (3)echo -e
est mauvais et mauvais de toute façon (si vous lisez la spécification POSIX, vous verrez que printf est la façon préférée de faire le formatage des chaînes, etecho -e
n'est pas garanti par POSIX de base à tout).Réponses:
Il existe de nombreuses façons de procéder. Les deux plus portables que je connaisse sont
sed
etod
- ils sont tous les deux POSIX.Il aime ... le
read
style s'échappe - style C.PRODUCTION
od
est un peu plus configurable ...Si vous voulez savoir quelles sont toutes ces options, vous pouvez regarder
man od
, mais je précise que je veux deux types d'échappements - les-t c
échappements avec barre oblique inverse et les-t a
caractères nommés. L'-w
option utilisée ci-dessus n'est pas spécifiée par POSIX.Et voici une petite fonction shell qui affichera de manière portable les valeurs octales de chaque octet dans ses arguments - qui, bien sûr,
od
pourraient également fonctionner avec-t o
:C'est simple. C'est un peu plus compliqué. Il devrait cependant être capable de faire ce que les
printf -q
implémentations spécifiques au shell peuvent faire.En utilisant l'exemple de chaîne précédente avec un peu plus:
PRODUCTION
Ce n'est que légèrement différent. Vous remarquerez peut-être qu'il y a un supplément
0
et un\b
ackslash supplémentaire . Cela permet de traduire facilement unread
ou un%b
printf
argument. Par exemple:PRODUCTION
la source
proctal
?bsq()
- manque-t-il quelque chose? Je demande parce que je ne suis pas entièrement confiant sur les contre-obliques.Lorsque vous supprimez le
-e
commutateur àecho
, dansbash
et à condition que l'xpg_echo
option n'ait pas été activée, il doit imprimer les chaînes comme rien de plus que leur texte d'origine. Donc,\n
et\t
apparaîtrait comme littéralement cela.Exemple
Vous pouvez également utiliser la
printf
commande intégrée deksh93
,zsh
oubash
pour le définir également.(
extrait debash
sortie montrée ci-dessus. Il y a quelques variations selon le shell).help printf
enbash
la source
printf %q
cela qui tronque les\n
s finaux , c'est la$()
capture de sortie qui les supprime.printf
à l' intérieur d'un sous-shell pour capturer sa sortie est idiot, carprintf -v varname
il mettra la sortie directement dans une variable, aucun sous-shell impliqué.printf
dans un sous-shell, je suis en cours d'exécutionecho
dans un, uniquement pour démontrer que vous pouvez prendre la sortie de caractères spéciauxecho
et la reconvertir en notation échappée.Vous pourriez utiliser quelque chose comme,
Maintenant, vous pourriez faire quelque chose comme,
Production
Un autre test général sans aucun fichier est comme,
La commande ci-dessus produit la sortie comme,
Les références
la source
Avec
zsh
, il y a les(q)
,(qq)
,(qqq)
,(qqqq)
drapeaux d'expansion variables qui peuvent citer les variables de différentes façons:Dans votre cas, vous voudrez probablement l'un des deux derniers.
la source
od -c
imprime normalement les caractères normaux, mais les caractères spéciaux (tabulation, retour à la ligne, etc.) et les caractères non imprimables commeprintf
code d'échappement.Donc:
Le
-An
ditod
de ne pas sortir l'adresse.la source
Utilisez la
printf
commande. Par exemple:printf "Hello\nthis is my line
affichera
la source
echo -e
, je cherche l' inverse .