2010-01-27 5 views
1

Première fois sed'er, alors soyez gentil.Aide avec sed regex: extrait du texte d'une étiquette spécifique

je le fichier texte suivant, « test_file »:

<Tag1>not </Tag1><Tag2>working</Tag2> 

Je veux extraire le texte entre <Tag2> utilisant l'expression rationnelle sed, il peut y avoir d'autres occurrences de <Tag2> et je voudrais extraire ceux aussi .

je Jusqu'à présent, cette expression rationnelle basée sed:

cat test_file | grep -i "Tag2"| sed 's/<[^>]*[>]//g' 

qui donne la sortie:

not working 

Toute une idée comment obtenir ce travail?

+0

D'après ce que vous avez écrit, je devine que vous avez seulement besoin du texte entre les balises Tag2. Est-ce exact? Si tel est le cas, savez-vous quel chat test_file | grep -i "Tag2" sorties? –

+1

Voir http: // stackoverflow.com/questions/1732348/regex-match-open-tags-sauf-xhtml-self-contained-tags – bmargulies

+2

Désolé de le dire, mais de poster * le lien * en réponse à une question liée à regex + (x) html sans en fournir plus l'information, est peut-être aussi fatiguant que la question elle-même. Venez y penser, c'est encore plus vrai. C'est l'équivalent de l'affichage de la citation notoire "programmeur * bla bla bla * problème * canapé * regex * gulp * a deux problèmes!". Si vous ressentez l'envie incontrôlable d'afficher le lien, au moins donner à l'affiche originale une légère indication de ce qu'il est sur le point de faire n'est pas la meilleure solution. –

Répondre

4

Comme une autre affiche l'a dit, sed peut ne pas être le meilleur outil pour ce travail. Vous pouvez utiliser quelque chose de construit pour l'analyse XML, ou même un simple langage de script, tel que perl.

Le problème avec votre essai, c'est que vous n'analysez pas la chaîne correctement.

cat test_file est bon - il imprime le contenu du fichier sur stdout.

grep -i "Tag2" est correct - il imprime seulement les lignes avec "Tag2" dedans. Ce n'est peut-être pas exactement ce que vous voulez. Gardez à l'esprit qu'il imprimera la ligne entière, pas seulement la partie <Tag2>, donc vous devrez toujours rechercher cette partie plus tard.

sed 's/&lt;[^&gt;]*[&gt;]//g' est pas ce que vous voulez - il supprime simplement les balises, y compris <Tag1> et <Tag2>.

Vous pouvez essayer quelque chose comme:

cat tmp.tmp | grep -i tag2 | sed 's/.*<Tag2>\(.*\)<\/Tag2>.*/\1/' 

Cela produira

working 

mais il ne fonctionne que pour une paire de balises.

+1

+1 pour ** NOT ** affichant * le lien * et répondant patiemment à la question ainsi que d'avertir qu'il ne s'agit pas d'une solution générale au problème. –

4

Pour votre bien, par exemple convivial, vous pouvez utiliser

sed -e 's/^.*<Tag2>//' -e 's!</Tag2>.*!!' test-file 

mais le XML là-bas est cruel et insensible. Vous demandez des problèmes sérieux en utilisant des expressions régulières pour gratter XML.

+3

+1 pour ** NOT ** affichant * le lien * et répondant patiemment à la question et avertissant que ce n'est pas une solution générale au problème. –

0

vous pouvez utiliser gawk, par exemple

$ cat file 
<Tag1>not </Tag1><Tag2>working here</Tag2> 
<Tag1>not </Tag1><Tag2> 
working 

</Tag2> 

$ awk -vRS="</Tag2>" '/<Tag2>/{gsub(/.*<Tag2>/,"");print}' file 
working here 

working 
0
awk -F"Tag2" '{print $2}' test_1 | sed 's/[^a-zA-Z]//g'