2016-04-07 5 views
1

D'abord, merci d'avance pour vos aides.Script shell Unix pour supprimer les nouvelles lignes précédées de caractères spécifiques

Je dois remplacer les nouvelles lignes (\ n) par un espace dans un fichier unix lorsqu'elles ne sont pas précédées de ';'.

Par exemple, si vous avez dans un quelque chose unix comme:

TestFields;TestFields2 
;TestFields3;TestFields4 

La sortie doit être:

TestFields;TestFields2 ;TestFields3;TestFields4 

Je me sers d'une commande sed comme ça:

sed ':a;N;$!ba;s/[^;]\n/ /g' 

Le problème est que cette commande remplacera aussi le caractère qui est avant \ n donc mon outpu est comme:

TestFields;TestFields ;TestFields3;TestFields4 

Je lâche le « 2 » dans le « TestFields2 » .. Quelqu'un a une idée sur la façon de garder mon caractère, mais remplacer le \ n?

+0

'sed ': a; N; $! Ba; s/\ ([^;] \) \ n/\ 1/g'' – ghoti

Répondre

0

capture le charbon et l'utilisation adaptée en remplacement

$ sed -r ':a;N;$!ba;s/([^;])\n/\1 /g' file 
TestFields;TestFields2 ;TestFields3;TestFields4 
suffixe

g est probablement pas nécessaire.

+0

Pas besoin d'utiliser ERE quand vous pouvez rendre ce portable. – ghoti

+0

Merci! ça marche, (mettra votre réponse quand elle sera activée) –

0

Cela pourrait fonctionner pour vous (GNU sed):

sed ':a;N;/;\n/!s/\n/ /;ta;P;D' file 

Une alternative à siphonage le fichier en mémoire et se lit comme la question a été lu à savoir si le caractère précédant le saut de ligne est un ; ne rien faire autrement remplacez le retour à la ligne par un espace.