web-dev-qa-db-fra.com

Comment échapper à une citation simple dans sed?

Comment échapper à une seule citation dans une expression sed déjà entourée de guillemets?

Par exemple:

sed 's/ones/one's/' <<< 'ones thing'
56
Thomas Bratt

Citez les codes sed avec des guillemets:

    $ sed "s/ones/one's/"<<<"ones thing"   
    one's thing

Je n'aime pas échapper à des codes avec des centaines de barres obliques inverses - ça me fait mal aux yeux. D'habitude je fais de cette façon:

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing
97
Kent

Une astuce consiste à utiliser la concaténation de chaînes Shell de chaînes adjacentes et à échapper le guillemet incorporé à l'aide de Shell

sed 's/ones/two'\''s/' <<< 'ones thing'

two's thing

L'expression sed contient 3 chaînes que le shell coud ensuite:

sed 's/ones/two'

\'

's/'

J'espère que ça aide quelqu'un d'autre!

23
Thomas Bratt

Le meilleur moyen est d'utiliser $'some string with \' quotes \''

par exemple:

sed $'s/ones/two\'s/' <<< 'ones thing'
6
John C

Utilisez simplement des guillemets doubles à l'extérieur de la commande sed.

$ sed "s/ones/one's/" <<< 'ones thing'
one's thing

Cela fonctionne aussi avec les fichiers.

$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing

Si vous avez des guillemets simples et / doubles dans la chaîne, c'est bien aussi. Juste échapper aux guillemets doubles.

Par exemple, ce fichier contient une chaîne avec des guillemets simples et doubles. J'utiliserai sed pour ajouter un guillemet simple et supprimer quelques guillemets doubles.

$ cat testfile
"it's more than ones thing"
$ sed -i "s/\"it's more than ones thing\"/it's more than one's thing/" testfile 
$ cat testfile 
it's more than one's thing
3
Stefanie Forrester

C'est un peu absurde mais je ne pouvais pas faire fonctionner \' dans sed 's/ones/one\'s/'. Je cherchais un script qui ajoutera automatiquement import 'hammerjs'; à mon fichier src/main.ts avec Angular. 

Voici ce que je me suis mis au travail:

apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts

Donc pour l'exemple ci-dessus, ce serait:

apost=\'
sed 's/ones/one'$apost's/'

Je ne sais pas pourquoi \' ne fonctionnerait pas tout seul, mais c'est comme ça.

1
Amanda G. Brown

Je sais que ça va ressembler à un flic, mais je ne pourrais jamais me laisser faire quand il y avait des guillemets simples et doubles dans la chaîne. Pour aider les débutants comme moi qui rencontrent des problèmes, une option consiste à séparer la chaîne. J'ai dû remplacer le code dans plus de 100 fichiers index.hmtl. Les chaînes avaient des guillemets simples et doubles, alors je viens de séparer la chaîne et de remplacer le premier bloc par <!-- et le second bloc par -->. Cela a gâché mes fichiers index.html, mais cela a fonctionné.

0
mcmacerson