Utilisation de script bash pour supprimer certaines lignes commençant par certains caractères

0

J'ai un fichier au format suivant:

--- V1 ---
Hi there
--- V2 ---
--- V3 ---
What's good
--- V4 ---
--- V5 ---
--- V6 ---

Je souhaite utiliser une sorte de script bash pour supprimer les lignes commençant par trois tirets non suivis immédiatement par une ligne ne comportant PAS trois tirets, par exemple:

--- V1 ---
Hi there
--- V3 ---
What's good

Je peux facilement supprimer TOUTES les lignes commençant par des tirets, mais je ne sais pas comment le faire en fonction de la ligne suivante (ou alternativement, en fonction de la ligne précédant les lignes sans tirets).

Birdie
la source
Probablement pas une réponse à votre question, mais une solution partielle en une ligne - grep -v -B1 "^ ---" fichier.nom. Recherchera toutes les lignes qui ne commencent pas par "---" et les affichera. et ligne ligne immédiatement avant. Cela ne fonctionnera que si chaque ligne de charge est suivie et précédée d'une ligne avec "---", c'est-à-dire qu'elle ne fonctionnera pas sur plusieurs lignes.
davidgo
Est - ce qu'il a d'être un script bash? Quelque chose comme cela pourrait être fait avec sed, grep, awk ou même vim.
Mikey TK
Il n'est pas nécessaire que ce soit un script bash, non. L'utilisation de grep ne l'empêche-t-elle pas d'être un script bash?
Birdie
@ davidgo Votre réponse a bien fonctionné pour plusieurs lignes correctement, alors si vous voulez en faire une réponse, alors n'hésitez pas et je la marquerai comme correcte. Sinon, j'accepterai la réponse de Gombai Sandor, qui est plus complexe mais également correcte.
Birdie
Merci pour cela. Je pense que la réponse de Gombai Sandors est plutôt bonne, alors je l’ai votée, mais j’ai ajouté la mienne parce que j’estime que c’est beaucoup plus facile et plus efficace.
davidgo

Réponses:

0
grep -v -B1 "^---" file.name 

Cherche toutes les lignes qui ne commencent pas par "---" et les affiche. "-B1" affiche la ligne immédiatement avant.

Davidgo
la source
2

Je suppose que "une sorte" signifie que vous n'insistez pas pour une pure bash. Si oui, alors awk peut le faire bien:

/tmp$ input="--- V1 ---
Hi there
--- V2 ---
--- V3 ---
What's good
--- V4 ---
--- V5 ---
--- V6 ---"
/tmp$ echo "$input" | awk '/^---/ {row = $0; if (wasdashed) next; wasdashed=1; next}; { if (wasdashed) print row; print $0}'
--- V1 ---
Hi there
--- V3 ---
What's good
/tmp$

Quoi qu'il en soit, avec la même logique, un pur bash serait possible, mais avec beaucoup plus de codage.

Gombai Sándor
la source
Cela donne une sortie complètement différente pour moi; --- V1 --- est répété après chaque ligne, mais est sinon la même sortie que l'entrée.
Birdie
@Birdie Assurez-vous de laisser les espaces en avant lorsque vous copiez / collez l'exemple ci-dessus. Fonctionne bien alors.
Oldskool