web-dev-qa-db-fra.com

Comment puis-je tout supprimer après la deuxième occurrence de citations à l'aide de la ligne de commande?

J'ai ce magasin dans une variable

 sCellEventTrap-03-28 TRAP-TYPE - Code CAC: 00 
 ENTERPRISE compaq 
 VARIABLES {scellNameDateTime, 
 scellSWComponent, 
 scellECode, [. .____.] scellCAC, 
 scellÉIP} 
 DESCRIPTION 
 "Gravité: normale - de nature informative. Un disque physique a subi une incohérence lors de la vérification périodique du disque. "
 - # TYPE" Evénement StorageCell "
 - # SUMMARY" SCellName-TimeDate% s: SWCID% d: ECode:% d: CAC% d: EIP% d. "
 - # ARGUMENTS {0,1,2,3,4,} 
 - # GRAVITÉ INFORMATIONNELLE 
 - # TIMEINDEX 136 
 - # STATE AVERTISSEMENT 
 :: = 13600808 

Je dois tout couper jusqu'à la deuxième occurrence de ". Donc ça me donnerait:

 sCellEventTrap-03-28 TRAP-TYPE - Code CAC: 00 
 ENTERPRISE compaq 
 VARIABLES {scellNameDateTime, 
 scellSWComponent, 
 scellECode, [. .____.] scellCAC, 
 scellÉIP} 
 DESCRIPTION 
 "Gravité: normale - de nature informative. Un disque physique a subi une incohérence lors de la vérification périodique du disque. "
 

Un autre exemple

 genericSanEvent TRAP-TYPE 
 ENTERPRISE hpSanManager 
 VARIABLES {severityLevel, category, id, 
 msgString, contactName, contactEmail, 
 contactWorkPhone, contactHomePhone, 
 contactPager, contactFax} 
 DESCRIPTION 
 "Un événement générique SAN a eu lieu. Les variables sont: 
 severityLevel - le niveau de gravité de l'événement; 
 category - Catégorie de l'événement signalé; 
 code - ID de l'événement dans la catégorie donnée; 
 msgString - chaîne de message décrivant 
 l'événement; 
 contactName - le nom de la personne 
 à notifier de l'événement; 
 contactEmail - l'adresse e-mail de l'individu 
 mentionné dans contactName; 
 contactWorkPhone - le numéro de téléphone au travail 
 de l'individu mentionné dans 
 contactName; 
 contactHomePhone - le numéro de téléphone personnel 
 de la personne mentionnée dans 
 contactName; 
 contactPager - le numéro de téléavertisseur de la personne 
 mentionnée dans contactName; 
 contactFax - le numéro de fax de l'individu 
 mentionné dans contactName "
 - Les attributs suivants sont utilisés par xnmloadmib pour améliorer le formatage 
 - # TYPE" OV SAM SAN événement "
 - # SOMMAIRE" OV SAM SAN événement, catégorie/I d:% d /% d, msg:% d Gravité:% d Contact:% d "
 - # ARGUMENTS {1,2,3,0,4} 
 - # GRAVITÉ CRITICAL 
 - # GÉNÉRIQUE 6 
 - # CATÉGORIE "Événements d’alerte d’application" 
 - # SOURCE_ID "T" 
 :: = 1 

La sortie pour cet exemple devrait être:

 genericSanEvent TRAP-TYPE 
 ENTERPRISE hpSanManager 
 VARIABLES {severityLevel, category, id, 
 msgString, contactName, contactEmail, 
 contactWorkPhone, contactHomePhone, 
 contactPager, contactFax} 
 DESCRIPTION 
 "Un événement générique SAN a eu lieu. Les variables sont: 
 severityLevel - le niveau de gravité de l'événement; 
 category - Catégorie de l'événement signalé; 
 code - ID de l'événement dans la catégorie donnée; 
 msgString - chaîne de message décrivant 
 l'événement; 
 contactName - le nom de la personne 
 à notifier de l'événement; 
 contactEmail - l'adresse e-mail de l'individu 
 mentionné dans contactName; 
 contactWorkPhone - le numéro de téléphone au travail 
 de l'individu mentionné dans 
 contactName; 
 contactHomePhone - le numéro de téléphone personnel 
 de la personne mentionnée dans 
 contactName; 
 contactPager - le numéro de téléavertisseur de la personne 
 mentionnée dans contactName; 
 contactFax - le numéro de fax de la personne 
 mentionnée dans contactName "
 
7
SamFlynn

Utilisation de awk:

awk -v RS='"' -v ORS='"' 'NR==1{print} NR==2{print; printf"\n";exit}' file

Cela définit le séparateur d'enregistrement sur ". Donc, nous voulons imprimer les deux premiers enregistrements et ensuite nous avons terminé. Plus en détail:

  • -v RS='"'

    Cela définit le séparateur d'enregistrement d'entrée sur un guillemet double.

  • -v ORS='"'

    Ceci définit le séparateur d'enregistrement en sortie sur une citation double.

  • NR==1{print}

    Cela indique à awk d’imprimer la première ligne.

  • NR==2{print; printf"\n";exit}

    Cela indique à awk d’imprimer la deuxième ligne, puis d’imprimer un caractère de nouvelle ligne, puis de quitter.

En utilisant sed

sed -r 'H;1h;$!d;x; s/(([^"]*"){2}).*/\1/' file

Cela lit tout le fichier à la fois. Donc, si le fichier est énorme, n'utilisez pas cette approche. Cela fonctionne comme suit:

  • H;1h;$!d;x

    C'est un langage Sed utile: il lit tout le fichier en une fois.

  • s/(([^"]*"){2}).*/\1/

    Cela cherche le deuxième " puis supprime tout le texte qui suit le deuxième guillemet.

    La regex (([^"]*"){2}) capture tout le texte jusqu'au deuxième guillemet compris et l'enregistre dans le groupe 1. La regex .* capture tout ce qui suit jusqu'à la fin du fichier. Le texte de remplacement est le groupe 1, \1.

9
John1024

Voici un petit script python:

#!/usr/bin/env python2
with open('/path/to/file.txt') as f:
    print '"'.join(f.read().split('"')[:2]) + '"'
  • f.read().split('"') lit le fichier entier en tant que chaîne, puis le divise en " pour obtenir toutes les parties " séparées.

  • Comme nous ne nous intéressons qu'aux deux premières parties " séparées, '"'.join(f.read().split('"')[:2]) joignera les deux premières à "

  • Enfin, nous avons ajouté un " pour obtenir le format souhaité.

3
heemayl

Bien que de nombreux programmes n'aiment pas les très longues lignes en entrée, lorsque vos données ne sont pas énormes, vous pouvez souvent simplifier correspondance sur plusieurs lignes en manipulant d'abord les données pour les mettre toutes sur une seule ligne, puis restaurer les nouvelles lignes.

Par exemple, utilisez tr pour remplacer newline \n par un caractère ne figurant pas dans vos données (j’ai utilisé chariot-return `\ r '), utilisez sed pour modifier cette ligne unique, puis revenez le caractère:

tr '\n' '\r' < file |
sed 's/\("[^"]*"\).*/\1/' |
( tr '\r' '\n';  echo ) # add a final newline

Sinon, même si vous indiquez que vous voulez sed/awk/grep, des langages tels que Perl et python utilisent des expressions régulières similaires à celles-ci et permettent de manipuler des chaînes de plusieurs lignes. Par exemple, Perl:

Perl -e '$_ = join("",<>); s/(".*?").*/$1/s; print "$_\n"; ' file
3
meuh

Utiliser Perl:

< infile Perl -0777 -pe 's/((.*?"){2}).*/$1/s' > outfile
  • -0777: glisse le fichier entier en même temps au lieu d'une ligne à la fois
  • -p: place une boucle while (<>) {[...]} autour du script et imprime le fichier traité.
  • -e: lit le script à partir des arguments

Répartition de la commande Perl:

  • s: affirme effectuer une substitution
  • /: lance le motif
  • ((.*?"){2}): correspond et regroupe un nombre quelconque de caractères, zéro ou plusieurs fois, dans le fichier actuel (c.-à-d. Qu'il correspond le moins de fois possible, en s'arrêtant lorsque le modèle suivant commence à correspondre) avant un caractère " , deux fois
  • .*: correspond à n'importe quel nombre de caractères, zéro ou plus, avec gourmandise dans le fichier actuel (c'est-à-dire qu'il correspond le plus souvent possible)
  • /: arrête le motif/démarre la chaîne de remplacement
  • $1: remplace par le premier groupe capturé
  • /: arrête la chaîne de remplacement/démarre les modificateurs
  • s: traite le fichier entier comme une seule ligne, permettant ainsi à . de correspondre aux nouvelles lignes
3
kos

Voici une version plus courte de awk: awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ '

$ awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ ' testfile.txt                             
   sCellEventTrap-03-28 TRAP-TYPE  -- CAC Code: 00
        ENTERPRISE compaq
        VARIABLES  { scellNameDateTime,
                     scellSWComponent,
                     scellECode,
                     scellCAC,
                     scellEIP}
        DESCRIPTION
             "Severity: Normal -- informational in nature. A physical disk drive has experienced an ID block inconsistency during a periodic drive check."


$ awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ ' testfile2.txt                                                 
    genericSanEvent TRAP-TYPE
        ENTERPRISE hpSanManager
        VARIABLES  { severityLevel, category, id,
                     msgString, contactName, contactEmail,
                     contactWorkPhone, contactHomePhone, 
                     contactPager, contactFax }
        DESCRIPTION
                        "A generic SAN event has occurred.  The variables are:
                            severityLevel - the event severity level;
                            category - Category of the event being reported;
                            code - ID of the event in the given category;
                            msgString - the message string describing
                                the event;
                            contactName - the name of the individual
                                to be notified of the event;
                            contactEmail - the e-mail address of the
                                individual referred to in contactName;
                            contactWorkPhone - the work phone number
                                of the individual referred to in 
                                contactName;
                            contactHomePhone - the home phone number
                                of the individual referred to in 
                                contactName;
                            contactPager - the pager number of the 
                                individual referred to in contactName;
                            contactFax - the FAX number of the individual
                                 referred to in contactName"
2