2017-10-20 59 views
1

J'ai un fichier xml et il a « < » entre les lignes sans caractères d'échappement devant .. Alors première chose que j'ai essayé d'analyser le xml en utilisant:grep pour exclure un symbole au début

xmllint --noout filename.xml 

mais cela ne fonctionne pas .. parce que mon xml version est 1.1 qui est pas pris en charge .. donc en tant que suppléant j'ai commencé à la recherche de « < » exclusion du début ou à la fin de la phrase ..

devrait être assez facile .. j'ai essayé:

grep -v '^[<]' 

mais cela ne fonctionne pas .. quelqu'un peut-il aider?

ex: nom de fichier a:

<instrument F001="6-A-1046" INSTRUMENT_ID="<xyz>" > 
    <field fieldname="CUR007" value="<EUR>"/> 
    <field fieldname="C207" value="2023-01-11"/> 
    <field fieldname="INS160" value="0"/> 
    <field fieldname="PRD013" value="1020"/> 
    <field fieldname="PRD150" value="0"/> 
    <field fieldname="PRD205" value="0"/> 
</instrument> 

Je veux sortie soit

<instrument F001="6-A-1046" INSTRUMENT_ID="<xyz>" > 
    <field fieldname="CUR007" value="<EUR>"/> 
+0

.. :) merci modifié – thealchemist

+0

Je ne suis pas en mesure de comprendre la logique dont vous avez besoin ici ... Pouvez-vous essayer d'expliquer encore pourquoi seulement les deux premières lignes doivent être montrées en sortie? – Sundeep

+1

@sundeep parce qu'il y a un "" <"' qui n'est pas premier ou dernier (excluant les espaces) – Bohemian

Répondre

1

Rechercher un < ou > autre que le premier/dernier caractère non blanc qui devrait être équerres .

grep '^\s*<.*[<>].*>\s*' 

Notez que cela correspond à la ligne, il peut être utilisé si vous êtes désireux de faire quelque chose avec la ligne (plutôt que seulement une partie de celui-ci).


Un test:

grep '^\s*<.*[<>].*>\s*' << EOF 
> <instrument F001="6-A-1046" INSTRUMENT_ID="<xyz>" > 
> <field fieldname="CUR007" value="<EUR>"/> 
> <field fieldname="C207" value="2023-01-11"/> 
> <field fieldname="INS160" value="0"/> 
> <field fieldname="PRD013" value="1020"/> 
> <field fieldname="PRD150" value="0"/> 
> <field fieldname="PRD205" value="0"/> 
> </instrument> 
> EOF 

Sortie:

<instrument F001="6-A-1046" INSTRUMENT_ID="<xyz>" > 
<field fieldname="CUR007" value="<EUR>"/> 
+0

'\ s ne sera pas reconnu par toutes les implémentations grep ... peut utiliser 'grep '^ [[: space:]] * <. * <'' ou 'grep '^ [[: blank:]] * <. * <'' – Sundeep

+0

Merci Lot @Bohemian .. et sur la recherche d'un '>' autre qu'à la fin ..? – thealchemist

+0

@thealchemist J'ai modifié la réponse pour qu'elle corresponde à l'une ou l'autre des crochets. – Bohemian

1

J'ai créé un autre échantillon d'ajouter quelques cas

$ cat ip.txt 
foo bar < xyz 
<123 abc <42> > 
    <good> 
bad > line 

$ # get lines having < not at start of line 
$ grep '[^[:blank:]].*<' ip.txt 
foo bar < xyz 
<123 abc <42> > 

$ # get lines having > not at end of line 
$ grep '>.*[^[:blank:]]' ip.txt 
<123 abc <42> > 
bad > line 

$ # combining the two 
$ grep -E '[^[:blank:]].*<|>.*[^[:blank:]]' ip.txt 
foo bar < xyz 
<123 abc <42> > 
bad > line 
  • [:blank:] représente l'espace et les personnages onglet
  • donc [^[:blank:]] correspondra à un caractère non-blanc
+1

merci un million de sundeep .. m'a beaucoup aidé :) – thealchemist