2009-12-20 8 views
10

Mon shell a un appel à 'fortune' dans mon fichier .login, pour me fournir un petit message du jour. Cependant, certaines des fortunes commencent par une ligne d'espace blanche, certaines commencent par deux, et d'autres n'ont aucune ligne d'espace. Cela me dérange.Supprimer les espaces vides du fichier

Je me suis assis pour emballer la fortune avec mon propre script shell, ce qui enlèverait tous les espaces blancs de l'entrée, sans détruire le formatage de la fortune réelle, qui peut intentionnellement avoir des lignes d'espaces. Cela n'a pas l'air d'être une solution simple de deux minutes, et comme je lisais (reed) à travers les pages de manuel pour sed et grep, j'ai pensé que je demanderais à nos merveilleux clients ici.

+0

pouvez vous montrer explicitement une fortune de l'échantillon et le point les parties que vous souhaitez modifier et les parties que vous considérez comme faisant partie de la mise en forme et qui ne devraient pas changer. – SiegeX

Répondre

16

En utilisant la même source que Dav:

# delete all leading blank lines at top of file 
sed '/./,$!d' 

Source: http://www.linuxhowtos.org/System/sedoneliner.htm?ref=news.rdf

De plus, voici pourquoi cela fonctionne:

La virgule sépare une "plage" de fonctionnement. sed peut accepter des expressions régulières pour les définitions de plage, donc /./ correspond à la première ligne avec "anything" (.) dessus et $ indique la fin du fichier. Par conséquent,

  • /./,$ correspond à "la première ligne non vide à la fin du fichier".
  • ! puis inverse cette sélection, en faisant effectivement "les lignes vides en haut du fichier".
  • d supprime ces lignes.
+0

Parfait !! Merci beaucoup Le lien s'avérera très utile à l'avenir aussi. – Maarx

+2

Il semble plus clair d'écrire: sed -n '/./,$p' –

+0

Pour que cela fonctionne avec les fichiers java ~ 30K que j'avais besoin de traiter, j'ai couru "find. -name '* .java' | xargs - n 1 sed -e '/./,$!d -i .bak "- le" -n 1 "était nécessaire pour que sed fonctionne correctement – Phil

1

Que diriez-vous:

sed "s/^ *//" < fortunefile 
+1

Pourquoi cela a-t-il été rejeté? C'est ainsi que j'ai lu la demande de l'OP. – SiegeX

0

je ne suis pas sûr de la façon dont votre message fortune ressemble vraiment, mais voici une illustration

$ string="  my message of the day" 
$ echo $string 
my message of the day 
$ echo "$string" 
     my message of the day 

ou vous pouvez utiliser awk

echo "${string}" | awk '{gsub(/^ +/,"")}1' 
Questions connexes