web-dev-qa-db-fra.com

Remplacer les espaces par une virgule dans un fichier texte sous Linux

J'ai besoin de modifier quelques fichiers texte (une sortie de sar) et de les convertir en fichiers CSV.

Je dois changer chaque espace (peut-être un onglet entre les nombres de la sortie) en utilisant des fonctions sed ou awk (un script Shell simple sous Linux).

Quelqu'un peut-il m'aider? Chaque commande que j'ai utilisée n'a pas changé le fichier du tout; J'ai essayé gsub.

51
aye
tr ' ' ',' <input >output 

Remplace chaque espace par une virgule. Si vous le souhaitez, vous pouvez effectuer une passe avec le drapeau -s (répétitions squeeze), qui remplace chaque séquence d'entrée d'un caractère répété répertorié dans SET1 (l'espace vide) par une seule occurrence de celle-ci personnage.

Utilisation des répétitions squeeze utilisées après les onglets de substitution:

tr -s '\t' <input | tr '\t' ',' >output 
74
Alberto Zaccagni

Essayez quelque chose comme:

sed 's/[:space:]+/,/g' orig.txt > modified.txt

La classe de caractères [: space:] correspondra à tous les espaces (espaces, tabulations, etc.). Si vous voulez juste remplacer un seul caractère, par exemple. juste de l'espace, utilisez-le seulement.

EDIT: En fait, [: espace:] inclut le retour chariot, ce qui peut ne pas faire ce que vous voulez. Ce qui suit va remplacer les tabulations et les espaces.

sed 's/[:blank:]+/,/g' orig.txt > modified.txt

comme le fera

sed 's/[\t ]+/,/g' orig.txt > modified.txt

Dans tout cela, vous devez faire attention à ce que les éléments de votre fichier séparés par des espaces ne contiennent pas leurs propres espaces que vous souhaitez conserver, par exemple. deux mots.

26
dave

sans regarder votre fichier d'entrée, seulement une supposition

awk '{$1=$1}1' OFS=","

rediriger vers un autre fichier et renommer au besoin

21
ghostdog74

Qu'en est-il quelque chose comme ceci:

cat texte.txt | sed -e 's/\s/,/g' > texte-new.txt

(Oui, avec quelques tâches inutiles; nous pourrions aussi utiliser <pour lire directement dans le fichier, je suppose - utilisé en premier par cat pour afficher le contenu du fichier, et seulement après, j'ai ajouté sed à ma ligne de commande )

EDIT: Comme @ ghostdog74 l'a souligné dans un commentaire, il n'y a définitivement pas besoin de thet cat/pipe; vous pouvez donner le nom du fichier à sed:

sed -e 's/\s/,/g' texte.txt > texte-new.txt

Si "texte.txt" est ainsi:

$ cat texte.txt
this is a text
in which I want to replace
spaces by commas

Vous obtiendrez un "texte-new.txt" qui ressemblera à ceci:

$ cat texte-new.txt
this,is,a,text
in,which,I,want,to,replace
spaces,by,commas

Je n'irais pas simplement remplacer l'ancien fichier par le nouveau (pourrait être fait avec sed -i, si je me souviens bien; et comme @ ghostdog74 l'a dit, celui-ci accepterait de créer la sauvegarde à la volée): Garder peut être judicieux, par mesure de sécurité (même si cela implique de le renommer comme suit: "texte-backup.txt")

9
Pascal MARTIN

Cette commande devrait fonctionner:

sed "s/\s/,/g" < infile.txt > outfile.txt

Notez que vous devez rediriger la sortie vers un nouveau fichier. Le fichier d'entrée n'est pas modifié en place.

7
Dawie Strauss

sed peut faire ceci:

sed 's/[\t ]/,/g' input.file

Cela enverra à la console, 

sed -i 's/[\t ]/,/g' input.file

éditera le fichier sur place

5
ezpz

Voici un script Perl qui éditera les fichiers sur place:

Perl -i.bak -lpe 's/\s+/,/g' files*

Les espaces consécutifs sont convertis en une seule virgule.
Chaque fichier d’entrée est déplacé vers .bak

Ces options de ligne de commande sont utilisées: 

  • -i.bak éditer sur place et faire des copies .bak

  • -p boucle autour de chaque ligne du fichier d'entrée, affiche automatiquement la ligne

  • -l supprime les nouvelles lignes avant traitement et les rajoute après

  • -e exécuter le code Perl

3
Chris Koknat

Si vous souhaitez remplacer une séquence arbitraire de caractères vides (tabulation, espace) par une virgule, utilisez les éléments suivants:

sed 's/[\t ]+/,/g' input_file > output_file

ou

sed -r 's/[[:blank:]]+/,/g' input_file > output_file

Si certaines de vos lignes d'entrée incluent des espaces, qui sont redondants et n'ont pas besoin d'être converties en virgules, commencez par les supprimer, puis convertissez les caractères vides restants en virgules. Dans ce cas, utilisez ce qui suit:

sed 's/ +//' input_file | sed 's/[\t ]+/,/g' > output_file
0
H.Alzy