Comment remplacer les crochets appariés avec d'autres syntaxe avec sed?
Je veux remplacer toutes les paires de crochets dans un fichier, par exemple, [some text]
avec \macro{some text}
par exemple:
This is some [text].
This [line] has [some more] text.
Cela devient:
This is some \macro{text}.
This \macro{line} has \macro{some more} text.
- Les paires seulement se produire sur des lignes individuelles, jamais sur plusieurs lignes.
- Parfois, il peut y avoir plus d'une paire sur une seule ligne, mais ils ne sont jamais imbriqués.
- Si un support est retrouvé seul sur une ligne, sans une paire, alors il ne devrait pas être changé.
Comment puis-je remplacer ces paires de crochets avec ce code?
source d'informationauteur Village
Vous devez vous connecter pour publier un commentaire.
Il regarde pour une parenthèse ouvrante, un certain nombre de explicitement la non-fermeture des crochets, puis un crochet de fermeture. Le groupe est capturé par les parens et inséré dans le remplacement de l'expression.
Il a fallu un peu de le faire, mais ici:
Voyons voir si je peux expliquer cette expression régulière:
\[
correspond à un crochet. Depuis[
est valide magie expression régulière personnage, la barre oblique inverse moyens pour correspondre au caractère littéral.sed
je peut faire référence à eux comme\1
\2
etc.\(...\)
. J'ai[^]]*
.[^...]
syntaxe signifie n'importe quel caractère, mais.[^]]
signifie n'importe quel caractère, mais une accolade de fermeture.*
signifie zéro ou plus de la précédente. Cela signifie que je suis la capture de zéro ou plusieurs caractères qui ne sont pas de la fermeture des crochets.\]
signifie le crochet de fermetureRegardons la ligne c'est [certains] [texte]
s
dans certains autant de caractères que possible, qui ne sont pas de clôture entre crochets. Cela signifie que je suis correspondant[some
mais seulement la capture desome
.[some
et maintenant, je suis d'appariement sur le dernier crochet de fermeture. Cela signifie que je suis correspondant[some]
. Notez que les expressions régulières sont normalement gourmand. Je vais vous expliquer ci-dessous pourquoi est-ce important.\\macro(\1)
. Le\1
est remplacé par mon groupe de capture. Le\\
est juste une barre oblique inverse. Donc, je vais remplacer[some]
avec\macro{some}
.Il serait beaucoup plus facile si je pouvais être la garantie d'un ensemble unique de crochets dans chaque ligne. Alors que j'aurais pu faire ceci:
Le groupe est en train de dire quelque chose entre crochets. Cependant, le problème est que les expressions régulières sont avides, cela signifie que je dois appariés de la
s
danssome
tout le chemin à la finalet
dans le texte. Le " x " ci-dessous montrent le groupe de capture. Le[
et]
montrer les crochets je suis d'appariement:Cela est devenu plus complexe, parce que j'ai eu de match sur des caractères qui ont une signification particulière pour les expressions régulières, nous voyons beaucoup de backslashing. De Plus, j'ai eu à rendre compte de l'expression régulière gourmandise, qui a eu l'agréable à regarder, non-correspondance de chaîne
[^]]*
pour correspondre à quoi que ce soit pas une parenthèse fermante. Ajouter dans les crochets avant et après\[[^]]*\]
et n'oubliez pas le\(...\)
groupe de capture:\[\([^]]*\)\]
Et vous obtenez un gros gâchis d'une expression régulière.utiliser des groupes
L'expression suivante correspond au modèle
[a-z, A-Z and space]
et le remplace par\macro{<whatever was between the []>}
Dans l'expression de la
\( ... \)
forme d'un match de groupe qui peut être référencé plus tard dans la substitution comme\1