10
votes

Supprimer toutes les lignes entre deux modèles (exclusif du motif) en utilisant SED ou AWK

J'ai un fichier texte de sortie un peu important où j'ai besoin de supprimer toutes les lignes entre deux motifs, mais conserver la correspondance de modèle.

Les fichiers ont l'air vaguement comme la sortie suivante. P>

sed: 1: "/^ +year/,/^ +_cons/{/^ ...": extra characters at the end of d command


0 commentaires

5 Réponses :


6
votes

Cela devrait fonctionner -

[jaypal:~/Temp] awk '/_cons/{print;f=0;next}/year/{f=1;print;next}f{next}1' file
TEST #1          
      coef1 |   48.36895    3.32013    14.57   0.000     41.86141    54.87649
      coef2 |  -50.08894   10.47335    -4.78   0.000    -70.61697   -29.56092
            |
  indicator |
         0  |   .6647992   2.646627     0.25   0.802     -4.55925    5.888849
         1  |   2.118701   5.225777     0.41   0.686     -8.19621    12.43361
            |
       year |
      _cons |   16.95753   6.342342     2.67   0.008     4.526383    29.38869
TEST #2          
      coef2 |   48.36895    3.32013    14.57   0.000     41.86141    54.87649
      coef3 |  -50.08894   10.47335    -4.78   0.000    -70.61697   -29.56092
            |
       year |
      _cons |   16.95753   6.342342     2.67   0.008     4.526383    29.38869


0 commentaires

3
votes

Essayez d'ajouter un point-virgule après d pour indiquer que la commande est terminée. (GNU sed - Le seul SED J'ai utile de tester - ne nécessite pas cela, mais peut-être un autre sed serait?)

En outre, si vous devez prendre en charge plusieurs implémentations de SED , vous ne pouvez pas utiliser + pour signifier "un ou plusieurs": ce n'est pas standard, et pas toutes les implémentations soutiens le. Vous pouvez utiliser \ {1, \} , mais c'est assez moche. . . J'utiliserais simplement * et faire une copie supplémentaire sur une copie supplémentaire.

donc: xxx

(testé, mais seulement GNU sed , pas OS X et certainement pas Aix, désolé.)


2 commentaires

Cela ne supprimera-t-il pas année aussi?


@Jaypalsingh: non. . . Eh bien, oui, mais pas pour une raison profonde: c'est seulement que j'ai échoué à remplacer une instance de + avec * . Corrigé maintenant. Merci.



1
votes

Vous pouvez le faire visuellement. Il suffit d'ouvrir le fichier avec gvim et exécutez la commande: xxx

explication:
  • g commande globale
  • / ^ \ s * an / + 1 ligne de match ci-dessous année
  • / ^ \ s * _cons / -1 correspondance ci-dessus _cons
  • d Supprimer la plage


0 commentaires

2
votes

Cela pourrait fonctionner pour vous:

 awk '/_cons/{p=0};!p;/year/{p=1}' file


0 commentaires

0
votes

Pour résumer et généraliser les deux solutions GNU SED qui fonctionnent:

sed '/BEGIN/,/END/{/BEGIN/!{/END/!d;}}' input.txt
sed '/BEGIN/,/END/{//!d}' input.txt


0 commentaires