1
votes

Supprimer plusieurs espaces - Script Unix

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 commentaires

Êtes-vous sûr que l'entrée comporte des espaces? tr aurait dû fonctionner. Essayez tr -d '[: blank:]'


En regardant à nouveau, il semble que ce que vous voulez vraiment, c'est simplement tr -d \\ t , pour supprimer les onglets


tr -d '[: blank:]' a fonctionné mais il supprime également les espaces (espace unique) dans l'adresse


Quelle coque utilisez-vous?


4 Réponses :


2
votes

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


4 commentaires

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' output.txt


\ 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.



3
votes

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 ).


0 commentaires

1
votes

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. ;)


0 commentaires

0
votes

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 ""'.


0 commentaires