web-dev-qa-db-fra.com

suppression d'un nouveau caractère de ligne du flux entrant à l'aide de sed

Je suis nouveau dans les scripts Shell et j'essaie de supprimer le nouveau caractère de ligne de chaque ligne à l'aide de SED. c'est ce que j'ai fait jusqu'à présent:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g'

supprime uniquement le premier caractère de la nouvelle ligne. J'ai trouvé quelque part cette commande:

printf "{new\nto\nlinux}" | sed ':a;N;$!ba;s/\n/ /g'

mais cela donne: "ba: événement non trouvé."

si je fais:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' | sed ':a;N;s/\n/ /g'

alors cela donne une sortie correcte mais je cherche quelque chose de mieux car je ne sais pas combien de nouveaux personnages j'obtiendrai lorsque j'exécuterai le script. le flux entrant provient d'écho ou de printf ou d'une variable du script. Merci d'avance

32
nav_jan

Pour supprimer les sauts de ligne, utilisez tr:

tr -d '\n'

Si vous souhaitez remplacer chaque nouvelle ligne par un seul espace:

tr '\n' ' '

L'erreur ba: Event not found vient de csh et est dû au fait que csh essaie de faire correspondre !ba dans votre liste d'historique. Vous pouvez échapper au ! et écrivez la commande:

sed ':a;N;$\!ba;s/\n/ /g'  # Suitable for csh only!!

mais sed n'est pas le bon outil pour cela, et vous feriez mieux d'utiliser un Shell qui gère plus raisonnablement les chaînes entre guillemets. Autrement dit, arrêtez d'utiliser csh et commencez à utiliser bash.

80
William Pursell

Cela pourrait fonctionner pour vous:

printf "{new\nto\nlinux}" | paste -sd' '            
{new to linux}

ou:

printf "{new\nto\nlinux}" | tr '\n' ' '            
{new to linux}

ou:

printf "{new\nto\nlinux}" |sed -e ':a' -e '$!{' -e 'N' -e 'ba' -e '}' -e 's/\n/ /g'
{new to linux}
6
potong