J'utilise la version 4.2.1 de GNU sed et j'essaye d'écrire une regex SED non gourmande pour extraire une chaîne délimitée par deux autres chaînes. C'est facile lorsque les chaînes de délimitation sont un seul caractère:Comment écrire une regex SED pour extraire une chaîne délimitée par une autre chaîne?
s:{\([^}]*\)}:\1:g
Dans cet exemple, la chaîne est délimitée par « { » à gauche et « } » à droite.
Si les chaînes délimitant sont multiples caractères, dire « {{{ » et '}}} Je peux régler l'expression ci-dessus comme ceci:
s:{{{\([^}}}]*\)}}}:\1:g
donc l'expression centrale correspond à tout ce ne contenant pas le' }}} 'chaîne de fermeture. Mais cela ne fonctionne que si la chaîne de correspondance ne contient pas de '}'. Quelque chose comme:
{{{cannot match {this broken} example}}}
ne fonctionnera pas, mais
{{{can match this example}}}
fonctionne. Bien sûr
s:{{{\(.*\)}}}:\1:g
fonctionne toujours, mais est gourmand donc ne convient pas où plusieurs motifs se produisent sur la même ligne.
Je comprends [^a]
à dire quoi que ce soit, sauf a
et [^ab]
signifier quoi que ce soit, sauf a
ou b
donc, bien qu'il apparaît au travail, je ne pense pas [^}}}]
est la bonne façon d'exclure cette séquence de 3 caractères consécutifs.
Alors, comment écrire une regex pour SED qui correspond à une chaîne délimitée par deux autres chaînes?
merci pour votre réponse - c'est ce que je soupçonnais car je savais que sed ne pouvait pas regarder en avant. J'ai trouvé que je n'avais pas besoin d'échapper au groupe de capture dans votre exemple: 's: {{{(. *?)}}}: $ 1 <: g'' (en fait, quand je l'ai fait, il ne l'a pas fait t travail). – starfry
@starfry, oups, vous avez raison sur le groupe de capture. C'était une faute de frappe. –