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 ?

1voto

Victoria Stuart Points 21

Remarque : les expressions sed contenant des variables BASH doivent être doublées ( " ) pour que la variable soit interprétée correctement.

Si vous également mettre la variable $BASH entre guillemets (pratique recommandée)

... vous pouvez alors échapper aux guillemets de la variable comme indiqué :

sed -i "s/foo/bar ""$VARIABLE""/g" <file>

C'est-à-dire qu'il faut remplacer la variable associée à $VARIABLE " con "" .

(Simplement -escaping "$VAR" como \"$VAR\" se traduit par une " -(chaîne de sortie entre guillemets).


Exemples

$ VAR='apples and bananas'
$ echo $VAR
apples and bananas

$ echo "$VAR"
apples and bananas

$ printf 'I like %s!\n' $VAR
I like apples!
I like and!
I like bananas!

$ printf 'I like %s!\n' "$VAR"
I like apples and bananas!

Ici, $VAR est " -entre guillemets avant de l'envoyer à sed (sed est soit ' - ou " -(citation) :

$ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed 's/"$VAR"/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed 's/""$VAR""/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed "s/$VAR/cherries/g"
I like cherries!

$ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
I like cherries!

Comparez cela à :

$ printf 'I like %s!\n' $VAR | sed "s/$VAR/cherries/g"
I like apples!
I like and!
I like bananas!

$ printf 'I like %s!\n' $VAR | sed "s/""$VAR""/cherries/g"
I like apples!
I like and!
I like bananas!

... et ainsi de suite ...

Conclusion

Ma recommandation, en tant que pratique courante, est la suivante

  • " -citer les variables BASH ( "$VAR" )
  • " -Citation, à nouveau , les variables ( ""$VAR"" ) s'ils sont utilisés dans une expression sed (qui doit elle-même être " -citation, pas ' -(citation)

    $ VAR='apples and bananas'

    $ echo "$VAR" apples and bananas

    $ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g" I like cherries!

1voto

Joshro Points 39

Ce qui a finalement fonctionné pour moi, c'est l'utilisation de l'option HEX de sed pour représenter :

Citation unique :

echo "book'" |sed -n '/book[\x27]/p'

livre

Solution des doubles guillemets

cat testfile

"http://www.fubar.com"

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

cat testfile

URL_FUBAR

0voto

SachinH Points 26
Prompt% cat t1
This is "Unix"
This is "Unix sed"
Prompt% sed -i 's/\"Unix\"/\"Linux\"/g' t1
Prompt% sed -i 's/\"Unix sed\"/\"Linux SED\"/g' t1
Prompt% cat t1
This is "Linux"
This is "Linux SED"
Prompt%

0voto

Andrey Points 913

Vous pouvez utiliser %

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

-5voto

Guilhem Hoffmann Points 812

Vous devez utiliser "\" pour échapper au caractère " (\" échappe le caractère suivant

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

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