De mon script shell, j'essaie de supprimer les espaces blancs répétitifs mais il semble que
1|First|PO BOX 123|DAYTON|OH|3432-222 2|Second|PO BOX 2223|CALIFORNIA|CA|23423 3|THIRD|PO BOX 21|COLUMBUS|OH|2223
ne fonctionne pas. Existe-t-il un autre moyen de supprimer plusieurs espaces vides consécutifs en un seul espace vide à partir du script shell.
J'essaie de supprimer les espaces vides du contenu
1 | First | PO BOX 123 | DAYTON | OH | 3432-222 2 | Second | PO BOX 2223 | CALIFORNIA | CA | 23423 3 | THIRD | PO BOX 21 | COLUMBUS | OH | 2223
dans ce
tr -s " " < input.txt > output.txt
4 Réponses :
Essayez d'utiliser sed
au lieu de tr
:
perl -ne 's#\s+\|\s+#|#g; print;' input > output
ou, en perl à la place:
sed 's/[[:blank:]]\{1,\}|[[:blank:]]\{1,\}/|/g' < input > output
Essayez d'utiliser l'option -r, certains systèmes Linux l'exigent pour les expressions régulières étendues: comme sed -r 's / \ s * \ | \ s * / | / g'
\ s
est une extension GNU sed des expressions régulières. De plus, +
fait partie des expressions régulières étendues ( sed -E
/ sed -r
), ou pris en charge comme extension de BRE dans GNU sed , mais doit être échappé. Donc: GNU sed, BRE: sed 's / \ s \ + | \ s \ + / | / g'
, ou GNU sed, ERE: sed -E 's / \ s + \ | \ s + / | / g '
(maintenant |
doit être échappé!), ou POSIX: sed' s / [[: blank:]] \ {1 , \} | [[: vide:]] \ {1, \} / | / g '
essayé toutes les suggestions fournies mais rien ne semble fonctionner. Malheureusement, ne peut pas utiliser perl et doit être dans le script shell. la version du système d'exploitation est-elle importante? J'utilise Oracle Enterprise Linux 2.6.39
Je crois que mon problème était différent de ce que la commande était censée être. Il semble que le fichier texte a été créé dans Windows et déplacé plus tard vers unix et c'est la raison pour laquelle l'une des commandes sed et tr ne fonctionnait pas. Le fichier a été régénéré sous unix et utilisé les commandes fournies semble résoudre le problème.
Utilisation minimale de sed
:
1|First|PO BOX 123|DAYTON|OH|3432-222 2|Second|PO BOX 2223|CALIFORNIA|CA|23423 3|THIRD|PO BOX 21|COLUMBUS|OH|2223
Output:
sed 's/ *| */|/g' input.txt
Remarque: il s'agit fonctionnellement du même code comme réponse de PaulProgrammer , mais simplifié du fait que input.txt L'espace blanc de est purement des caractères d'espace "
", (pas de tabulations, et al ).
J'aime utiliser awk pour les choses qui ont des enregistrements. tr
tr répond au texte, sed
est un s tream ed itor, mais awk comprend le concept d'enregistrements, de champs, de séparateurs de champs, etc.
Alors pour compléter votre jeu d'options, voici une solution en awk minimal:
$ awk -F ' *[|] *' '$1=$1' OFS='|' input.txt
Ceci définit un séparateur de champ d'entrée avec -F
et un séparateur de champ de sortie avec OFS
. Le script se compose d'une instruction qui entraîne la réécriture de l'enregistrement avec OFS
, et d'une instruction (le raccourci 1
) pour imprimer la ligne.
Notez l'étrange échappement de la barre verticale dans l'option -F
. Si vous deviez utiliser ceci, pour éviter toute confusion, vous voudrez peut-être awk -F '* [|] *' ...
à la place.
Pour être encore plus court à la au détriment de la clarté, vous pouvez également utiliser:
$ awk -F ' *\\| *' '{$1=$1} 1' OFS='|' input.txt 1|First|PO BOX 123|DAYTON|OH|3432-222 2|Second|PO BOX 2223|CALIFORNIA|CA|23423 3|THIRD|PO BOX 21|COLUMBUS|OH|2223
Cela transforme l'instruction de réécriture d'enregistrement en une condition qui doit toujours retourner true, éliminant ainsi le besoin de 1 raccourci. Bien que cela supprime quelques caractères du script, je ne l'inclus que pour le plaisir; mieux vaut utiliser un code qui ne vous fait pas vous gratter la tête lorsque vous le relisez dans un an ou deux. ;)
J'ai dû faire quelque chose comme ça dans le /etc/servicesfile.
Aucune des méthodes sed n'a fonctionné pour moi (sur cette question et bien d'autres).
tr -s "" aussi n'a rien fait tr -s "\ t" a supprimé certains des espaces blancs (l'ajout de tr -s "" n'a rien fait non plus)
Une solution que j'ai trouvée était d'utiliser 'column -t'
column -t /etc/services | tr -s " "
Si je comprends bien (peut être faux), la commande de colonne crée une table. le -t définit le nombre de colonnes (ce qui, je pense, n'est pas spécifié car il provient du fichier d'entrée). alors je peux supprimer tous les espaces supplémentaires avec 'tr -s ""'.
Êtes-vous sûr que l'entrée comporte des espaces?
tr
aurait dû fonctionner. Essayeztr -d '[: blank:]'
En regardant à nouveau, il semble que ce que vous voulez vraiment, c'est simplement
tr -d \\ t
, pour supprimer les ongletstr -d '[: blank:]' a fonctionné mais il supprime également les espaces (espace unique) dans l'adresse
Quelle coque utilisez-vous?