Comment puis-je remplacer des espaces par de nouvelles lignes sur une entrée comme:
/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5
etc...
Pour obtenir ce qui suit:
/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5
Remarque
Je poste cette question pour aider les autres utilisateurs, il n’était pas facile de trouver une réponse utile sous UNIX SE jusqu’à ce que je commence à taper cette question. Après cela, j'ai trouvé ce qui suit:
Question connexe
Comment puis-je trouver et remplacer par une nouvelle ligne?
bash
text-processing
string
laconbass
la source
la source
Réponses:
Utilisez la
tr
commandeTrouvé sur http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html
la source
tr
qu’il faut faire!Dans ce cas, j'utiliserais printf:
S'il y a des espaces dans l'un des chemins, vous pouvez citer ce chemin de fichier afin d'éviter sa division sur les espaces:
Pour transformer du texte en général,
tr
votre meilleur choix est celui décrit dans une réponse existante.la source
En supposant que vous ayez une chaîne avec des espaces comme séparateurs:
Cependant, vous posez probablement la mauvaise question. (Pas nécessairement, par exemple, cela pourrait apparaître dans un fichier makefile.) Une liste de noms de fichiers séparés par des espaces ne fonctionne pas vraiment: que se passe-t-il si l'un des noms de fichiers contient des espaces?
Si un programme reçoit des noms de fichiers sous forme d'arguments, ne les associez pas à des espaces. Utilisez
"$@"
pour y accéder un par un. Bien queecho "$@"
les arguments soient séparés par des espaces, cela est dû àecho
: il affiche ses arguments avec des espaces comme séparateurs.somecommand "$@"
transmet les noms de fichiers sous forme d'arguments distincts à la commande. Si vous souhaitez imprimer les arguments sur des lignes séparées, vous pouvez utiliserSi vous avez des noms de fichiers séparés par des espaces et que vous souhaitez les utiliser dans un tableau, vous pouvez utiliser un développement de variable non entre guillemets pour scinder la valeur en caractères
IFS
(vous devez désactiver le développement de caractères génériquesset -f
, sinon glob les motifs seront étendus dans la valeur):Vous pouvez encapsuler ceci dans une fonction qui restaure le
-f
réglage et la valeurIFS
quand c'est fait:la source
set -f
etIFS
dans le manuel bash si vous voulez tous les détails. Voir aussi unix.stackexchange.com/questions/16192/…IFS
local ne prend pas effetSoyez pragmatique, utilisez sed !!
Ce qui précède dit de remplacer un ou plusieurs caractères d'espacement (\ s +) par une nouvelle ligne (\ n)
C'est plus ou moins:
la source
Au lieu
tr
de @laconbass, vous pouvez également utiliserxargs
dans ce cas:L'avantage est que cela fonctionne même avec plusieurs espaces, ce qui
tr
n'est pas le cas.la source
Voici comment je l'ai fait:
Notez l'utilisation de la touche Entrée après la barre oblique inverse dans la
sed
commande.la source
sed
plustr
?sed
car c'est un éditeur plutôt que de simplement traduire des caractères.sed
peut faire tellement plus, mais est totalement excessive pour cela.tr
C’est le bon outil pour CE métier, mais la connaissance desed
regex sera utile plus tard!Une autre approche, en supposant que la ligne se trouve dans une variable appelée
line
:Ceci utilise le fait que Bash divise ses arguments sur les espaces par défaut et qu’il
echo
ajoute une nouvelle ligne à son entrée par défaut.la source
est une autre méthode pour transformer des mots séparés par un espace en virgules séparées.
la source
Le script suivant est facile à comprendre et à utiliser.
la source
tr
) est la même que dans la réponse acceptée. A côté de cela, votre réponse présente les problèmes suivants: a) la commande n'est pas indentée de 4 espaces (-> disposition de démarquage) b) votre utilisation decat
est inutile (vous pouvez la remplacer par< filename tr ' ' '\n'
). c) Votre nom de fichier de sortie est le même que le nom de fichier d'entrée. Avec cela, vous créez une course de données.