7
votes

Comment insérer le caractère Newline après la virgule in `), (` avec SED?

Comment insérer le caractère Newline après la virgule dans ), ( code> avec SED?

$ more temp.txt
(foo),(bar)
(foobar),(foofoobar)

$ sed 's/),(/),\n(/g' temp.txt 
(foo),n(bar)
(foobar),n(foofoobar)


2 commentaires

Quelle plate-forme et quelle version de SED utilisez-vous?


Dupliqué possible de Insérer Newline (\ N) à l'aide de SED


4 Réponses :


3
votes

Il vous suffit de vous échapper avec un caractère de barre oblique inverse et d'appuyer sur la touche ENTER lors de la saisie:

$ sed 's/),(/),\
(/g' temp.txt
(foo),
(bar)
(foobar),
(foofoobar)


2 commentaires

Cela ne fonctionne pas si vous mettez la commande SED dans un fichier Bash. Ce n'est que si vous mettez `\` avant le nouveau caractère de ligne, il commence à fonctionner. Mais je me demande pourquoi?


@ user001 pour ce qui vaut, la même commande exacte a fonctionné pour moi à Bash 4.2.10 à Ubuntu 11.10.



7
votes

sed code> ne prend pas en charge la séquence d'échappement \ n code> dans sa commande de substitution, il prend en charge un véritable caractère de nouvelle ligne si vous vous échappez (car sed code> Les commandes ne doivent utiliser qu'une seule ligne, et l'évasion est ici pour indiquer sed code> que vous voulez vraiment un personnage nouveau):

$ NL='
'
$ sed "s/),(/,\\$NL(/g" temp.txt
(foo),
(bar)
(foobar),
(foofoobar)


2 commentaires

Dans la première approche, pourquoi il doit être \ `mais pas `?


La commande que vous passez à sed ne sont pas censées contenir de nouvelles lignes. Donc, si vous voulez passer une nouvelle ligne, vous devez vous échapper avec une barre oblique inverse afin que sed sache que vous avez fait exprès. Et vous avez besoin d'une seconde barre-dos pour protéger le premier d'être interprété par la coquille (à l'aide de la barre oblique inverse pour échapper au caractère dans REGEXP, il y a une mauvaise idée car elle est également généralement utilisée pour citer le caractère de la chaîne, et vous devez donc utiliser un double back-backslash. dans regexp).



3
votes

Cela fonctionne pour moi: xxx

J'utilise:

  • GNU SED 4.2.2
  • GNU BASH, version 4.3.48 (1) -Release (X86_64-PC-Linux-GNU)

0 commentaires

3
votes

OK, je sais que cette question est vieille mais je viens de devoir wade creux cela pour que SED accepte un personnage \ N. J'ai trouvé une solution qui travaille à Bash et je le note ici pour d'autres personnes qui rencontrent le même problème.

Pour reformuler le problème: Demandez à SED d'accepter la barre oblique inverse la nouvelle ligne (ou d'autres caractères qui échappaient à l'arrière-plan à l'échelle arrière). P>

La solution de contournement dans Bash est d'utiliser: p> xxx pré>

in bash une chaîne $ '\ n' est remplacée par une nouvelle ligne réelle. P>

La seule autre chose que vous devez faire est la double évasion de l'évacuation de \ n comme vous devez échapper à la barre oblique elle-même. p>

Pour tout mettre ensemble: P>

sed -i $'s/),(/),\\\n(/g' temp.txt


0 commentaires