web-dev-qa-db-fra.com

Extrait du texte Démarrage à l'en-tête de catégorie spécifique sur l'en-tête de catégorie suivante d'un fichier texte

J'ai un fichier TOML dans le format suivant (les catégories peuvent avoir n'importe quel nom, la numérotation séquentielle n'est qu'un exemple et non garantie):

[CATEGORY_1]
A=1
B=2

[CATEGORY_2]
C=3
D=4

E=5

...

[CATEGORY_N]
Z=26

Ce que je veux réaliser est de récupérer le texte dans une catégorie donnée.

Donc, si je spécifie, disons, [CATEGORY_1] Je veux que cela me donne la sortie:

A=1
B=2

J'ai essayé d'utiliser grep pour atteindre cette tâche, avec le drapeau z, il pourrait donc interpréter les nouvelles lignes comme des caractères nuls et utiliser cette expression régulière:

(^\[.*])             # Match the category 
  ((.*\n*)+?         # Match the category content in a non-greedy way
    (?=\[|$))        # Lookahead to the start of other category or end of line

Cela ne fonctionnait pas à moins que je retiens le ^ au début de l'expression. Cependant, si je fais cela, il interprétera mal interpréter des paires de parenthèses en tant que catégorie.

Y a-t-il un moyen de le faire correctement? Sinon avec grep, avec un autre outil, tel que sed ou awk.

3
Educorreia

Si je vous comprends correctement, vous pouvez utiliser cette commande sed:

# Choose the category until the next [ character
# and then delete any line starting with the [ character
$ sed -n '/^\[CATEGORY_2\]/,/^\[/p' file | sed '/^\[/d'
C=3
D=4

E=5
5