2010-11-05 5 views
1

Sous Linux (BusyBox, QNAP-NAS), je souhaite ajouter un chemin supplémentaire à mon fichier .bashrc via un script utilisant sed. La partie correspondante du fichier se présente comme suit:Insérer (ou ajouter) une ligne se terminant par une barre oblique inverse () en utilisant sed

[...] 
export PATH=\ 
/bin:\ 
/sbin:\ 
/usr/bin:\ 
/usr/sbin:\ 
/usr/local/bin 
[...] 

La ligne supplémentaire doit être inséré (à la position 4 dans le fichier d'origine) est /opt/bin:/opt/sbin:\. Pour obtenir ce fait mon sed one-liner ressemble à ceci:

sed '4i/opt/bin:/opt/sbin:\\' .bashrc > .bashrc.tmp 

, échappant correctement à la barre oblique inverse. D'une certaine manière sed convertit le reste \' dans une nouvelle ligne de manger la barre oblique inverse, entraînant:

[...] 
export PATH=\ 
/opt/bin:/opt/sbin: 

/bin:\ 
[...] 

Ajout d'un troisième backslash me donne la barre oblique inverse, mais ajoute encore le saut de ligne, donc

sed '4i/opt/bin:/opt/sbin:\\\' .bashrc > .bashrc.tmp 

résultats dans

export PATH=\ 
/opt/bin:/opt/sbin:\ 

/bin:\ 

Si j'ajoute un espace supplémentaire dans ma commande sed

sed '4i/opt/bin:/opt/sbin:\\ ' .bashrc > .bashrc.tmp 

Tout va bien, mais j'obtiens aussi de l'espace en fin de ligne.

export PATH=\ 
/opt/bin:/opt/sbin:\ # extra space here 

/bin:\ 

Qu'est-ce que le truc pour est maintenant une seconde commande sed supprimant les espaces de fin

#!/bin/sh 

sed -e '4i/opt/bin:/opt/sbin:\\ ' .bashrc > .bashrc.tmp 
sed -e 's/[ \t]*$//' .bashrc.tmp > .bashrc.tmp2 # change \t to real tab 

Mais je me demande pourquoi sed transforme \' en une nouvelle ligne, et comment résoudre le travail ci-dessus un simple doublure? Comment puis-je insérer (ou ajouter) une ligne avec une barre oblique inverse à l'aide de sed? Merci d'avance.

Répondre

1

Voici une solution de contournement:

sed '4s|^|/opt/bin:/opt/sbin:\\\n|' .bashrc 
+0

Fonctionne comme le charme, merci. – skipperTux

+0

christoph, vous pouvez accepter la réponse en cliquant sur le "tick". –

0

Cela ressemble à un bug dans busybox sed. Cela fonctionne bien avec GNU sed 4.2.1.

+0

Oh, je devrais avoir vérifié que, en premier lieu. Cela fonctionne bien avec Debian/Ubuntu et GNU sed 4.2.1. ainsi, il y a un bug dans BusyBox sed. Je pourrais maintenant coller avec mon deux-ligne, mais j'aime mieux la solution de contournement de Dennis. – skipperTux

0

Si de toute aide, j'utilisé quatre antislashs pour ajouter une barre oblique inverse sans espace au OND d'une ligne.

Ma commande ressemble à ceci:

sed "1i #backtrace_script\n#!/bin/sh\ngeany -si \\\\" \ 

qui se traduit par

#!/bin/sh 
geany -si \ 
Questions connexes