Il y a deux niveaux d'interprétation ici: la coquille et sed.
Dans le shell, tout ce qui se trouve entre guillemets simples est interprété littéralement, à l'exception des guillemets simples eux-mêmes. Vous pouvez effectivement avoir un seul devis entre guillemets simples en écrivant '\''
(fermez un seul devis, un seul devis littéral, ouvrez un seul devis).
Sed utilise des expressions régulières de base . Dans un BRE, pour les traiter littéralement, vous $.*[\^
devez les citer en les faisant précéder d'une barre oblique inverse, sauf dans les jeux de caractères ( […]
). Les lettres, les chiffres et (){}+?|
ne doivent pas être cités (vous pouvez vous en tenir à certaines de ces implémentations). Les séquences \(
, \)
, \n
, et , dans certaines mises en œuvre \{
, \}
, \+
, \?
, \|
et d' autres caractères alphanumériques + barre oblique inverse ont une signification particulière. Vous pouvez vous en tirer en ne citant pas $^
certaines positions dans certaines implémentations.
De plus, vous avez besoin d'une barre oblique inverse avant /
si elle doit apparaître dans l'expression rationnelle en dehors des expressions entre crochets. Vous pouvez choisir un autre caractère comme séparateur en écrivant, par exemple, s~/dir~/replacement~
ou \~/dir~p
; vous aurez besoin d'une barre oblique inverse avant le délimiteur si vous souhaitez l'inclure dans le BRE. Si vous choisissez un caractère qui a une signification particulière dans un BRE et que vous souhaitez l'inclure littéralement, vous aurez besoin de trois barres obliques inverses. Je ne le recommande pas, car cela peut se comporter différemment dans certaines implémentations.
En un mot, pour sed 's/…/…/'
:
- Ecrivez l'expression régulière entre guillemets simples.
- Utilisez
'\''
pour finir avec une seule citation dans la regex.
- Mettez une barre oblique inverse avant
$.*/[\]^
et uniquement ces caractères (mais pas à l'intérieur des expressions entre crochets). (Techniquement vous ne devriez pas mettre une barre oblique inverse avant ]
mais je ne sais pas d'une mise en œuvre qui traite ]
et \]
différemment en dehors des expressions du support.)
- Dans une expression de parenthèse, pour
-
être traité littéralement, assurez-vous qu’elle est première ou dernière ( [abc-]
ou [-abc]
non [a-bc]
).
- Dans une expression de parenthèse, pour
^
être traité à la lettre, assurez-vous que ce n’est pas la première (utilisation [abc^]
, non [^abc]
).
- Pour inclure
]
dans la liste des caractères mis en correspondance par une expression entre crochets, ^
définissez- le comme premier (ou premier après pour un ensemble annulé): []abc]
ou [^]abc]
(ni [abc]]
nor[abc\]]
).
Dans le texte de remplacement:
&
et \
doivent être cités en les précédant par une barre oblique inverse, comme le font le délimiteur (généralement /
) et les nouvelles lignes.
\
suivi d'un chiffre a une signification particulière. \
suivi d'une lettre a une signification spéciale (caractères spéciaux) dans certaines implémentations, et \
suivi d'un autre caractère \c
ou en c
fonction de l'implémentation.
- Avec des guillemets simples autour de l'argument (
sed 's/…/…/'
), utilisez '\''
pour mettre un guillemet simple dans le texte de remplacement.
Si le regex ou le texte de remplacement provient d'une variable shell, rappelez-vous que
- La regex est un BRE, pas une chaîne littérale.
- Dans l'expression rationnelle, une nouvelle ligne doit être exprimée sous la forme
\n
(ce qui ne correspondra jamais à moins que vous n'ayez un autre sed
code ajoutant des caractères de nouvelle ligne à l'espace de modèle). Mais notez que cela ne fonctionnera pas dans les expressions entre crochets avec certaines sed
implémentations.
- Dans le texte de remplacement
&
, \
et les nouvelles lignes doivent être citées.
- Le délimiteur doit être cité (mais pas à l'intérieur d'expressions entre crochets).
- Utilisez des guillemets doubles pour l' interpolation:
sed -e "s/$BRE/$REPL/"
.
function sedPath { path=$((echo $1|sed -r 's/([\$\.\*\/\[\\^])/\\\1/g'|sed 's/[]]/\[]]/g')>&1) } #Escape path for use with sed