Utilisation de sed pour convertir les nouvelles lignes en espaces


22

Disons que j'ai une variable shell $stringqui contient du texte avec plusieurs sauts de ligne, par exemple:

string="this
is 
a test"

Je voudrais convertir cette chaîne en une nouvelle chaîne new_stringoù tous les sauts de ligne sont convertis en espaces:

new_string="this is a test"

J'ai essayé:

print $string | sed 's/\n/ /g'

mais ça n'a pas marché

Je me demande également s'il existe un moyen de le faire en utilisant perl -0777 's/\n/ /g'ou peut-être la commande tr?


Réponses:


32

Si vous souhaitez uniquement supprimer les nouvelles lignes de la chaîne, vous n'avez pas besoin de les utiliser sed. Vous pouvez utiliser simplement

$  echo "$string" | tr '\n' ' '

comme d'autres l'ont souligné.

Mais si vous souhaitez convertir de nouvelles lignes en espaces sur un fichier en utilisant sed, vous pouvez utiliser:

$ sed -i ':a;N;$!ba;s/\n/\t/g' file_with_line_breaks

ou même awk:

$ awk '$1=$1' ORS=' ' file_with_line_breaks > new_file_with_spaces

1
spongeest un utilitaire utile pour écraser un fichier d'entrée. Il fait partie du package moreutils... par exemple. awk '$1=$1' ORS=' ' file |sponge file
Peter.O

@ferer Merci pour l'information. Installation en cours moreutils...
pferor


4

Encore une autre option serait d'utiliser xargs(qui, en plus, serre plusieurs espaces blancs):

string="this
    is 
a    test"

printf "$string" | xargs   # this is a test

3

Echo ignore les espaces blancs, donc cela devrait fonctionner:

new_string=`echo $string`

Oui, cela fonctionnera, mais peut-être trop bien. Il réduira plusieurs espaces blancs en un seul espace. Cela inclut la conversion des tabulations en espaces.
Peter.O

3

Si vous avez déjà la chaîne comme une variable bash, comme votre exemple montre, il est inutile et le gaspillage des ressources (et plus besoin de taper) pour appeler sed, awk, printf, etc ... Vous pouvez simplement utiliser l' expansion variable bash :

string="${string//$'\n'/ }"

Vous n'avez même pas besoin de le réaffecter. Vous pouvez utiliser l'extension telle $stringquelle et laisser inchangée.

printf "${string//$'\n'/ }" >file

3

Vous pouvez également essayer cette commande awk,

awk -v RS="" '{gsub (/\n/," ")}1' file

Exemple:

$ (echo This; echo is; echo a; echo test.) | awk -v RS="" '{gsub (/\n/," ")}1'
This is a test.

1
state=$(set +o)
set -f ; IFS='
'; set -- $string
unset IFS; string="$*"
eval "$state"

Cela convertit toute séquence d'un ou plusieurs \ncaractères ewline apparaissant dans la variable shell $stringen un seul <space>.


0

Vous pouvez utiliser la simple commande sed

 $-sed ':loop;N;s/\n/ /g;t loop'
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.