63 votes

Remplacer tous les espaces par un saut de ligne / marque de paragraphe pour créer une liste de mots

J'essaie de lister du vocabulaire pour un texte grec que nous traduisons en classe. Je veux remplacer chaque espace ou tabulation par une marque de paragraphe afin que chaque mot apparaisse sur sa propre ligne. Quelqu'un peut-il me donner la commande sed et expliquer ce que je fais? J'essaie encore de comprendre.

94voto

Greg Bacon Points 50449

Vous pouvez utiliser

sed -e 's/\s\+/\n/g' old > new

La séquence d'échappement \s correspond à tout caractère d'espacement (espace, tabulation, saut de ligne, et ainsi de suite), de sorte \s\+ moyen d'une course d'un ou plusieurs espaces pour être remplacé par un simple retour à la ligne. L' /g sur la fin signifie effectuer la substitution autant de fois que possible, plutôt qu'une seule fois.

La commande ci-dessus utilise le fichier old en entrée et écrit de la modification de la sortie d' new.

56voto

Laurence Gonsalves Points 50783

Le portable façon de le faire est:

sed -e 's/[ \t][ \t]*/\
/g'

C'est un véritable retour à la ligne entre le slash et le slash-g. De nombreux sed implémentations ne sais pas à propos de \n, si vous avez besoin d'un littéral de retour à la ligne. La barre oblique inverse avant le retour à la ligne empêche sed de s'énerver à propos de la nouvelle ligne. (dans les scripts sed, les commandes sont normalement terminée par des retours à la ligne)

Avec GNU sed vous pouvez utiliser \n dans la substitution, et \s dans la regex:

sed -e 's/\s\s*/\n/g'

GNU sed prend également en charge "extended" expressions régulières (c'est egrep de style, pas de perl de style) si vous lui donnez l'-r drapeau, alors vous pouvez utiliser +:

sed -r -e 's/\s+/\n/g'

Si c'est pour Linux seulement, vous pouvez probablement aller avec la GNU commande, mais si vous voulez que cela fonctionne sur les systèmes avec un non-GNU sed (par exemple: BSD, Mac OS X), vous pouvez aller avec le plus d'option portable.

7voto

RAJ Points 31
  1. Option 1

     echo $(cat testfile)
     
  2. Option 2

     tr '\n' ' ' < testfile
     

4voto

Tristram Gräbener Points 5566

Cela devrait faire le travail:

 sed -e 's/[ \t]+/\n/g'
 

[ \t] signifie un espace OU un onglet. Si vous souhaitez utiliser n'importe quel type d'espace, vous pouvez également utiliser \s .

[ \t]+ signifie autant d'espaces OU d'onglets que vous le souhaitez (mais au moins un)

s/x/y/ signifie que le motif x est remplacé par y (ici, \n est une nouvelle ligne)

Les g à la fin signifient que vous devez répéter autant de fois que cela se produit dans chaque ligne.

0voto

ghostdog74 Points 86060

Utilisation de gawk :

 gawk '{$1=$1}1' OFS="\n" file
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X