2009-10-20 8 views
8

Fichier1:Utilisez sed pour supprimer tous les principaux/espaces vides dans un fichier texte

hello 
    world 

Comment peut-on supprimer les principaux/suivi des espaces vides dans ce fichier en utilisant sed - à l'aide d'une commande (pas de fichiers intermédiaires?

J'ai actuellement obtenu:

sed -e 's/^[ \t]*//' a > b 

Pour les espaces plus grands.

sed 's/ *$//' b > c 

Et ceci pour les espaces de fin.

+0

Alors que la réponse de @ ghostdog74 est bonne, la réponse de @ mouviciel est la * correcte *, selon votre question. J'ai voté les deux, mais je crois que @mouviciel mérite d'être accepté comme la bonne réponse. –

+0

Vous avez raison - mouviciel est maintenant accepté. Merci à deux mouviciel (bonne réponse) et ghostdog74 (directions à awk) pour leur temps! – user191960

Répondre

10

Vous presque l'avez:

sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c 

plus sur certaines saveurs de sed, il y a également une option pour ligne d'édition:

sed -i -e 's/^[ \t]*//;s/[ \t]*$//' a 
+3

J'envisagerais aussi de faire correspondre '\ s' qui est le générique 'tous les caractères d'espaces'. –

+0

Cela ne devrait-il pas être 'sed -e 's/^ [\ t] * //; s/[\ t] * $ //' a> c'? –

+0

Je vois toujours 'sed -e 's/^ [\ t] * //; s/[\ t] * $ /' a> c' qui ne fonctionne pas pour moi (bash version 4.3.30, Funtoo-Linux). –

7

manière plus facile, en utilisant awk

awk '{$1=$1}1' file 

ou

awk '{gsub(/^ +| +$/,"")}1' file 
+0

Le premier a fonctionné parfaitement et est le plus simpliste - je sais ce n'est pas ce que j'ai demandé (c'est-à-dire sed) - mais c'est si élégant :). Je vais regarder dans awk maintenant. – user191960

+0

Le premier supprime tous les espaces parasites, non seulement en avant et en arrière.Le second fonctionne le mieux. 'awk' est un excellent outil. – mouviciel

+0

Ah, je vois les autres espaces supprimés avec le premier maintenant - le second fonctionne sans suppressions supplémentaires. – user191960

3
perl -lape 's/^\s+|\s+$//g' 

Honnêtement, je sais perl regExps le meilleur, donc je trouve perl -lape beaucoup plus facile à utiliser que sed -e.

En outre, pour répondre à la question initiale, vous pouvez avoir sed exécuter plusieurs opérations comme celle-ci:

sed -e 's/something/something else/' -e 's/another substitution/another replacement/' 

Apparemment, vous pouvez aussi mettre les deux substitutions dans une chaîne et en les séparant par un point-virgule, comme indiqué dans une autre réponse.

0

Notez que dans le cas plus général de l'application de plusieurs filtres dans une ligne à un fichier d'entrée sans utiliser des fichiers intermédiaires, la solution est d'utiliser des tuyaux:

sed -e 's/^[ \t]*//' a | sed -e 's/ *$//' > c 

Il est évident qu'ils ne sont pas nécessaires ici parce qu'une invocation de sed est suffisant, mais si la seconde commande sed était quelque chose de différent, comme uniq ou sort, alors ce pattern est le bon.

Questions connexes