web-dev-qa-db-fra.com

Comment faire correspondre une citation unique dans SED

Comment faire correspondre une seule citation dans SED si l'expression est enfermée dans des guillemets simples:

sed -e '...'

Par exemple, besoin de faire correspondre ce texte:

'foo'
35
grigy

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 personnages Unicode. Solidus inverse est plus communément appelé backslash.

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

47
tzot

Comme indiqué dans les commentaires à la question, il ne s'agit pas vraiment de SED, mais comment inclure une citation dans une chaîne citée dans une coquille (E.g. Bash).

Pour clarifier une réponse précédente, vous devez échapper à la citation avec une barre oblique inverse, mais vous ne pouvez pas le faire dans une expression unique citée. De la page homme Bash:

Les caractères joints en guillemets simples préservent la valeur littérale de chaque caractère dans les guillemets. Un seul devote peut ne pas se produire entre guillemets simples, même lorsqu'il est précédé d'une barre oblique inverse.

Par conséquent, vous devez mettre fin à l'expression citée, insérez la citation échappée et démarrez une nouvelle expression citée. L'enlèvement de la citation de la coque n'ajoute aucun espace supplémentaire, donc en effet, vous obtenez une concaténation à la chaîne.

Donc, pour répondre à la question initiale de savoir comment citer l'expression "foo", vous feriez quelque chose comme ceci:

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

(Où '...' est le reste de l'expression SED).

Dans l'ensemble, pour des raisons de lisibilité, vous seriez bien mieux de changer les citations environnantes aux citations doubles si possible:

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

[Par exemple, le cauchemar de maintenance potentiel de la première approche (unique citation), notez comment la syntaxe de Stackoverflow met en évidence la mise en évidence des citations, des backslashes et d'autres textes - il n'est certainement pas correct.]

37
TimB