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)
4 Réponses :
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)
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.
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)
Dans la première approche, pourquoi il doit être \ `mais pas code>`?
La commande que vous passez à sed code> 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 code> 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).
Cela fonctionne pour moi: J'utilise: p>
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> 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
Quelle plate-forme et quelle version de SED utilisez-vous?
Dupliqué possible de Insérer Newline (\ N) à l'aide de SED