47 votes

Comment faire correspondre un guillemet simple dans sed

Comment faire correspondre un guillemet simple dans sed si l'expression est entourée de guillemets simples :

sed -e '...'

Par exemple, vous devez faire correspondre ce texte :

'foo'

0 votes

L'étiquette [sed] est plus ou moins incorrecte, puisque la question pourrait porter sur awk, par exemple, sans que le contenu en soit modifié. Il devrait s'agir de 'shell', mais je n'ai pas de nouvelle étiquette.

1 votes

@TimB : shell-quoting est un tag complètement nouveau, et redondant puisque "shell", "escaping" sont plus que suffisants. "Escaping" est utilisé depuis des décennies (près de 40 ans) lorsqu'on dépouille des caractères de leur signification particulière dans le shell et la question portait sur l'échappement d'une citation.

58voto

tzot Points 32224

Vous pouvez soit utiliser :

"texta'textb" (APOSTROPHE inside QUOTATION MARKs)

ou

'texta'\''textb' (APOSTROPHE text APOSTROPHE, then REVERSE SOLIDUS, APOSTROPHE, then APOSTROPHE more text APOSTROPHE)

J'ai utilisé des noms de caractères unicode. REVERSE SOLIDUS est plus connu sous le nom de backslash.

Dans ce dernier cas, vous fermez votre apostrophe, puis vous la citez avec une barre oblique inverse, puis vous ouvrez une autre apostrophe pour le reste du texte.

6 votes

Le deuxième cas est celui que je recherchais. Merci.

50voto

TimB Points 3646

Comme indiqué dans les commentaires de la question, il ne s'agit pas vraiment de sed, mais de la façon d'inclure une citation dans une chaîne de caractères citée dans un shell (par exemple bash).

Pour clarifier une réponse précédente, vous devez échapper au guillemet avec une barre oblique inverse, mais vous ne pouvez pas le faire dans une expression à guillemet unique. Extrait de la page de manuel de bash :

Encadrer les caractères entre guillemets simples préserve la valeur littérale de chaque caractère entre guillemets. Un simple ne peut pas se trouver entre des guillemets simples même s'il est précédé d'un barre oblique inversée.

Par conséquent, vous devez terminer l'expression citée, insérer le guillemet échappé et commencer une nouvelle expression citée. La suppression des guillemets par l'interpréteur de commandes n'ajoute pas d'espaces supplémentaires, de sorte que vous obtenez en fait une concaténation de chaînes de caractères.

Ainsi, pour répondre à la question initiale, à savoir comment mettre l'expression "foo" en guillemets, vous devez procéder comme suit :

sed -e '...'\''foo'\''...'

(où '...' est le reste de l'expression sed).

Dans l'ensemble, pour des raisons de lisibilité, il est préférable de remplacer les guillemets par des guillemets doubles, dans la mesure du possible :

sed -e "...'foo'..."

(Pour illustrer le cauchemar potentiel de la première approche (guillemets simples) en matière de maintenance, notez comment la coloration syntaxique de StackOverflow colore les guillemets, les barres obliques inversées et les autres textes - ce n'est absolument pas correct).

0 votes

Une fantastique explication approfondie, merci

1voto

Rachel Points 23

Pour sed, une solution très simple consiste à changer le format des guillemets simples en guillemets doubles.

Pour une variable donnée qui contient des guillemets simples

var="I'm a string with a single quote"

Si des guillemets doubles sont utilisés pour sed, cela correspondra au guillemet simple.

echo $var | sed "s/'//g"
Im a string with a single quote

Plutôt que des guillemets simples, qui accrocheront

echo $var | sed 's/'//g'

-1voto

dragon788 Points 1102

Vous pouvez également utiliser ['] pour correspondre à un guillemet simple littéral sans avoir besoin de recourir à des astuces de citation de l'interpréteur de commandes.

myvar="stupid computers can't reason about life"
echo "$myvar" | sed -e "s/[']t//"

Sorties :

stupid computers can reason about life

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