Comment remplacer les espaces par des retours à la ligne / entrer dans un fichier texte?


18

J'ai un simple fichier texte nommé "exemple".

Lecture avec la commande du terminal: cat example

Production:

abc cdef ghi jk lmnopq rst uv wxyz

Je veux convertir (transformer) sous la forme suivante: (sortie attendue de cat example)

abc
cdef
ghi
jk
lmnopq
rst
uv
wxyz

Comment puis-je le faire via la ligne de commande?

(Ce n'est qu'un exemple de fichier, je veux convertir la position du mot en colonne verticale)


Réponses:


37

Quelques choix:

  1. Le classique, utilisez tr:

    tr ' ' '\n' < example
    
  2. Utilisation cut

    cut -d ' ' --output-delimiter=$'\n' -f 1- example
    
  3. Utilisation sed

    sed 's/ /\n/g' example
    
  4. Utilisation perl

    perl -pe 's/ /\n/g' example
    
  5. Utilisez la coquille

    foo=$(cat example); echo -e ${foo// /\\n}
    

Pour l' sedexemple, j'avais besoin d'ajouter un $pour obtenir bash à remplacer par une nouvelle ligne réelle, c'est-à-dire:sed $'s/ /\\\n/g' example
acumartini

Exemple ci-dessus pour OSX sed, pour gnu-sed:sed $'s/ /\\n/g'
acumartini

16

Essayez la commande ci-dessous

awk -v RS=" " '{print}' file

OU

awk -v RS='[\n ]' '{print}' file

Exemple:

$ awk -v RS=" " '{print}' example
abc
cdef
ghi
jk
lmnopq
rst
uv
wxyz

Explication:

RS (Record seperator) est une variable awk intégrée. Dans la première commande, la valeur donnée à la variable de séparation d'enregistrement est l'espace. donc awk rompt l'impression à chaque fois qu'il trouve un espace.

Dans la deuxième commande, la valeur donnée à la variable RS est un espace ou un nouveau caractère de ligne. Cette commande élimine la ligne vierge supplémentaire apparue lors de l'exécution de la première commande.


8

Vous pouvez utiliser xargs,

cat example | xargs -n 1

ou mieux

xargs -n 1 < example

6
xargs -n 1 < examplevous sauve 1 chaton
Rinzwind

2

Utilisation d'un perloneliner:

perl -p -i -e 's/\s/\n/g' example

Il remplacera les espaces et les tabulations par "ENTER" (aka \n)


1

Personne n'a publié de python, alors voici:

python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt 

Nous redirigeons le fichier d'entrée dans pythonle flux stdin de, et le lisons ligne par ligne. Chaque ligne est supprimée de son retour à la ligne de fin, divisée en mots, puis rejointe en une chaîne où chaque mot est séparé par un retour à la ligne. L'une et l'autre. Finalement, nous nous retrouvons avec une liste de chaînes, qui est ensuite à nouveau jointe en une chaîne plus grande, et imprimée sur le flux stdout. Celui-ci peut ensuite être redirigé vers un autre fichier avec > out.txt redirection.


0

Similaire au «tr» ci-dessus mais avec les ajouts:

  • Fonctionne également pour les onglets

  • Convertit plusieurs espaces ou tabulations en 1 nouvelle ligne

    tr -s '[:space:]' '\n' < example
    
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.