web-dev-qa-db-fra.com

supprimer les espaces blancs dans bash en utilisant sed

J'ai un fichier qui contient un numéro suivi d'un chemin de fichier sur chaque ligne pour une grande quantité de fichiers. Il ressemble donc à ceci:

      7653 /home/usr123/file123456

Mais le problème est qu'il y a 6 espaces blancs vides devant lui qui jettent le reste de mon script. J'ai inclus la ligne qui le produit ci-dessous:

cat temp | uniq -c | sed 's/  */ /g' > temp2

Je l'ai réduit à la commande uniq qui produit l'espace blanc inutile. J'ai essayé d'implémenter une commande sed pour supprimer l'espace blanc mais pour une raison quelconque, il supprime tout sauf un. Comment pourrais-je modifier ma déclaration sed ou ma déclaration uniq pour supprimer ces espaces blancs? Toute aide serait grandement appréciée!

11
Sal

Pour supprimer tous les espaces vides, utilisez:

sed 's/^ *//g'

Pour supprimer tous les espaces blancs de tête de toutes sortes:

sed 's/^[[:space:]]*//g'

Le symbole ^ Ne correspond qu'au début d'une ligne. Pour cette raison, ce qui précède laissera seuls les espaces non au début de la ligne.

10
John1024

Décomposition de votre modèle sed actuel 's/*// g': Le modèle de recherche, '*', correspond à un seul espace, suivi de zéro ou plusieurs espaces. Le modèle de remplacement, '', est un espace unique. Le résultat est de trouver n'importe quel ensemble d'un ou plusieurs espaces et de le remplacer par un seul espace, supprimant ainsi tous les espaces sauf un. Pour le faire supprimer tout, vous pouvez simplement faire de votre modèle de remplacement la chaîne vide, '': sed 's/* // g'

Notez, cependant, que le "g" le rend global, ce qui supprimera également l'espace entre le numéro et le chemin du fichier. Si vous souhaitez simplement supprimer l'espace de tête, vous pouvez simplement supprimer le g. Vous pouvez également utiliser le quantificateur +, qui signifie "au moins un", au lieu du *, qui signifie "au moins zéro". Cela vous laisserait avec: sed 's/\ + /'

ETA: Comme le souligne John1024, vous pouvez également utiliser l'ancre ^ pour spécifier le début de la ligne et le caractère générique\s pour spécifier les caractères d'espacement au lieu de simplement les espaces: sed 's/\ s\+ //'

0
eewallace