Si vous souhaitez le faire et supprimer les espaces dont vous avez besoin :
echo -n "Hello" | od -A n -t x1 | sed 's/ *//g'
Les deux premières commandes du pipeline sont bien expliquées par @TMS dans sa réponse, telle que modifiée par @James. La dernière commande diffère du commentaire @TMS en ce qu'elle est à la fois correcte et a été testée. L'explication est :
sed
est un s streamer ed itor.s
est le s commande de remplacement./
ouvre une expression régulière - n'importe quel caractère peut être utilisé./
est conventionnel, mais peu pratique pour le traitement, par exemple, du XML ou des noms de chemin./
ou le caractère alternatif que vous avez choisi, ferme l'expression régulière et ouvre la chaîne de substitution.- En
/ */
le*
correspond à n'importe quelle séquence du caractère précédent (dans ce cas, un espace). /
ou le caractère alternatif que vous avez choisi, ferme la chaîne de substitution. Dans ce cas, la chaîne de substitution//
est vide, c'est-à-dire que la correspondance est supprimée.g
est l'option pour faire cette substitution g lobally sur chaque ligne au lieu d'une seule fois pour chaque ligne.- Les guillemets empêchent l'analyseur de commandes de se confondre - la séquence entière est passée à
sed
comme première option, à savoir unsed
script.
@TMS cerveau enfant (sed 's/^ *//'
) supprime uniquement les espaces au début de chaque ligne (^
correspond au début de la ligne - 'espace de motif' dans sed
-parler).
Si vous souhaitez également supprimer les retours à la ligne, le moyen le plus simple consiste à ajouter
| tr -d '\n'
aux tubes de commande. Il fonctionne comme suit :
|
envoie le flux précédemment traité à l'entrée standard de cette commande.tr
est le tr commande de traduction.-d
spécifie la suppression des caractères correspondants.- Les guillemets répertorient vos caractères correspondants - dans ce cas, juste une nouvelle ligne (
\n
).Translate correspond uniquement à des caractères uniques, pas à des séquences.
sed
est particulièrement retardé lorsqu'il s'agit de nouvelles lignes. C'est parce que sed
est l'un des plus anciens unix
commandes - il a été créé avant que les gens ne sachent vraiment ce qu'ils faisaient. Un logiciel hérité omniprésent l'empêche d'être corrigé. Je le sais car je suis né avant unix
est né.
L'origine historique du problème était l'idée qu'une nouvelle ligne était un séparateur de ligne, et non une partie de la ligne. Il a donc été supprimé par les utilitaires de traitement de ligne et réinséré par les utilitaires de sortie. Le problème est que cela fait des hypothèses sur la structure des données utilisateur et impose des restrictions non naturelles dans de nombreux contextes. sed
L'incapacité de à supprimer facilement les retours à la ligne est l'un des exemples les plus courants de cette idéologie malformée causant du chagrin.
Il est possible de supprimer les retours à la ligne avec sed
- c'est juste que toutes les solutions que je connais font sed
traiter l'intégralité du fichier en une seule fois, ce qui s'étouffe pour les fichiers très volumineux, ce qui va à l'encontre de l'objectif d'un éditeur de flux. Toute solution qui conserve le traitement de ligne, si cela est possible, serait un nid de rat illisible composé de plusieurs tuyaux.
Si vous insistez pour utiliser sed
essayez :
sed -z 's/\n//g'
-z
indique sed
pour utiliser des valeurs nulles comme séparateurs de ligne.
En interne, une chaîne en C
se termine par un nul. Le -z
l'option est également le résultat d'un héritage, fourni par commodité pour C
les programmeurs qui aimeraient utiliser un fichier temporaire rempli de C
-strings et épuré par les retours à la ligne. Ils peuvent alors facilement lire et traiter une chaîne à la fois. Encore une fois, les premières hypothèses sur les cas d'utilisation imposent des restrictions artificielles sur les données des utilisateurs.
Si vous omettez le g
option, cette commande supprime uniquement la première nouvelle ligne. Avec le -z
choix sed
interprète le fichier entier comme une seule ligne (à moins qu'il n'y ait des valeurs nulles errantes intégrées dans le fichier), terminée par une valeur nulle, ce qui étouffe également les fichiers volumineux.
Vous pourriez penser
sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//'
pourrait fonctionner. La première commande place un null au début de chaque ligne ligne par ligne, ce qui donne \n\x00
terminer chaque ligne. La deuxième commande supprime une nouvelle ligne de chaque ligne, désormais délimitée par des valeurs nulles - il n'y aura qu'une seule nouvelle ligne en vertu de la première commande. Il ne reste que les faux nuls. Jusqu'ici tout va bien. L'idée erronée ici est que le tube alimentera la dernière commande ligne par ligne, puisque c'est ainsi que le flux a été construit. En fait, la dernière commande, telle qu'elle est écrite, ne supprimera qu'un seul null puisque maintenant le fichier entier n'a pas de saut de ligne et est donc sur une seule ligne.
L'implémentation de canal simple utilise un fichier temporaire intermédiaire et toutes les entrées sont traitées et introduites dans le fichier. La commande suivante peut être exécutée dans un autre thread, lisant simultanément ce fichier, mais elle ne voit que le flux dans son ensemble (bien qu'incomplet) et n'a aucune connaissance des limites de bloc qui alimentent le fichier. Même si le tube est une mémoire tampon, la commande suivante voit le flux dans son ensemble. Le défaut est inextricablement intégré à sed
.
Pour que cette approche fonctionne, vous avez besoin d'un g
option sur la dernière commande, donc encore une fois, il s'étouffe avec de gros fichiers.
L'essentiel est le suivant :n'utilisez pas sed
pour traiter les retours à la ligne.
echo hello | hexdump -v -e '/1 "%02X "'
echo -n "Hello" | od -A n -t x1
Explication :
- Le
echo
programme fournira la chaîne à la commande suivante. - Le
-n
flag indique à echo de ne pas générer de nouvelle ligne à la fin du "Hello". - Le
od
programme est le programme "dump octal". (Nous fournirons un indicateur pour lui dire de le vider en hexadécimal au lieu d'octal.) - Le
-A n
flag est l'abréviation de--address-radix=n
, n étant l'abréviation de "aucun". Sans cette partie, la commande produirait un préfixe d'adresse numérique laid sur le côté gauche. Ceci est utile pour les vidages volumineux, mais pour une chaîne courte, cela n'est pas nécessaire. - Le
-t x1
flag est l'abréviation de--format=x1
, le x étant l'abréviation de "hexadécimal" et le 1 signifiant 1 octet.