105 votes

Comment échapper aux barres obliques et aux guillemets doubles et simples dans sed ?

D'après ce que j'ai pu constater, lorsque vous utilisez des guillemets simples, tout ce qui se trouve à l'intérieur est considéré comme littéral. C'est ce que je veux pour ma substitution. Mais je veux aussi trouver une chaîne qui a des guillemets simples ou doubles.

Par exemple,

sed -i 's/"http://www.fubar.com"/URL_FUBAR/g'

Je veux remplacer "http://www.fubar.com" par URL_FUBAR. Comment sed est-il censé reconnaître mon // ou mes doubles guillemets ?

Merci de votre aide !

EDIT : Puis-je utiliser s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g ?

Est-ce que \N- les caractères à l'intérieur des guillemets simples sont réellement échappés ?

129voto

Kusalananda Points 1683

En s/// dans la commande sed vous permet d'utiliser d'autres caractères à la place de / comme délimiteur, comme dans

sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'

ou

sed 's,"http://www\.fubar\.com",URL_FUBAR,g'

Les guillemets ne posent pas de problème. Pour faire correspondre les guillemets simples, il suffit d'intervertir les deux types de guillemets. Notez qu'une chaîne entre guillemets simples ne peut pas contenir de guillemets simples (même pas échappés).

Les points doivent être échappés si sed est de les interpréter comme des points littéraux et non comme le motif d'expression régulière . qui correspond à n'importe quel caractère.

39voto

tony duan Points 367

En ce qui concerne les guillemets simples, voir le code ci-dessous utilisé pour remplacer la chaîne de caractères let's con let us :

commande :

echo "hello, let's go"|sed 's/let'"'"'s/let us/g'

résultat :

bonjour, allons-y

20voto

Denis Points 535

Mon problème était que je devais avoir le "" à l'extérieur de l'expression puisque j'ai une variable dynamique à l'intérieur de l'expression sed elle-même. Donc, la solution actuelle est celle de Lenn Jackman qui consiste à remplacer l'expression " à l'intérieur de l'expression rationnelle sed avec [\"] .

Mon projet complet est donc le suivant :

RELEASE_VERSION="0.6.6"

sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml

Voici :

# est le séparateur sed

[\"] = " dans les expressions rationnelles

valeur = \"tags/$RELEASE_VERSION\" = ma chaîne de remplacement, ce qui est important c'est qu'elle n'a que le caractère \" pour les citations

13voto

glenn jackman Points 69748

Il est difficile d'échapper à un guillemet simple entre guillemets simples. Essayez ceci :

sed "s@['\"]http://www.\([^.]\+).com['\"]@URL_\U\1@g" 

Exemple :

$ sed "s@['\"]http://www.\([^.]\+\).com['\"]@URL_\U\1@g" <<END
this is "http://www.fubar.com" and 'http://www.example.com' here
END

produit

this is URL_FUBAR and URL_EXAMPLE here

2voto

Échapper à un guillemet double peut être absolument nécessaire dans sed : par exemple, si vous utilisez des guillemets doubles dans l'ensemble de l'expression sed (comme vous devez le faire lorsque vous voulez utiliser une variable shell).

Voici un exemple qui traite de l'échappement dans sed, mais aussi d'autres problèmes de citation dans bash :

# cat inventory
PURCHASED="2014-09-01"
SITE="Atlanta"
LOCATION="Room 154"

Supposons que vous souhaitiez changer la pièce à l'aide d'un sed script que vous pouvez utiliser à l'infini, vous variabilisez donc l'entrée comme suit :

# i="Room 101" (these quotes are there so the variable can contains spaces)

Ce script ajoutera la ligne entière si elle n'existe pas, ou remplacera simplement (en utilisant sed) la ligne existante par le texte plus la valeur de $i.

if grep -q LOCATION inventory; then 
## The sed expression is double quoted to allow for variable expansion; 
## the literal quotes are both escaped with \ 
    sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory
## Note the three layers of quotes to get echo to expand the variable
## AND insert the literal quotes
else 
    echo LOCATION='"'$i'"' >> inventory
fi

P.S. J'ai écrit le script ci-dessus sur plusieurs lignes pour que les commentaires soient analysables, mais je l'utilise comme une ligne de commande qui ressemble à ceci :

i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X