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?

Amelio Vazquez-Reina
la source

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
pferor
la source
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
5

Vous pouvez essayer d'utiliser à la trplace:

echo "$string" | tr '\n' ' '
Mark McKinstry
la source
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
user57553
la source
3

Echo ignore les espaces blancs, donc cela devrait fonctionner:

new_string=`echo $string`
Kevin
la source
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
Peter.O
la source
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.
Avinash Raj
la source
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>.

mikeserv
la source
0

Vous pouvez utiliser la simple commande sed

 $-sed ':loop;N;s/\n/ /g;t loop'
Kalanidhi M.
la source