J'ai utilisé cette commande pour obtenir une sortie, mais je souhaite modifier la sortie pour obtenir un résultat final réduit.
Résultat requis:
EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"
Commander:
grep --color -H -r "__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions" /opt/tibco/product/tra/domain/WFM-DEV 2>/dev/null
Sortie que je vois actuellement:
/opt/tibco/product/tra/domain/WFM-DEV/data/EsbDwMarkDownAdbSub.dat: <instanceInfoPropertyname="__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions/CleClient" value="3.1"/>
/opt/tibco/product/tra/domain/WFM-DEV/data/EsbDwMarkDownAdbSub.dat: <instanceInfoProperty name="__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions/Encrypter" value="1.0"/>
La sortie souhaitée peut être réalisée assez facilement avec Python2:
$ ./trim_lines.py < input.txt
EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"
Le contenu du script trim_lines.py
:
#!/usr/bin/env python
import sys,os,re
for line in sys.stdin:
words=line.strip().split()
val1 = os.path.basename(words[0]).split(".")[0]
val2 = '"' + os.path.basename(words[2])
val3 = re.split("[=/]",words[-1])[1]
print val1,val2,val3
Ce qui se passe ici est assez simple. Nous utilisons <
pour rediriger le contenu du fichier d'entrée vers un script (dans votre cas, où une entrée provenant de grep utilise le tuyau ...| ./trim_lines.py
pour envoyer la sortie de grep
au script). Le script parcourt toutes les lignes qui entrent dans son flux stdin, scinde chaque ligne en mots et les filtre en outre à l'aide de quelques modules intégrés, tels que os.path
et re
. Les deux premières valeurs obtenues utilisent os.path.basename()
, et la dernière utilise re.split()
pour décomposer la dernière chaîne à plusieurs délimiteurs. Il se passe beaucoup de choses ici, mais croyez-moi, c'est assez simple.
Vous pouvez, par exemple, diriger le résultat dans sed
(peut-être pourrions-nous vous donner un moyen plus élégant de connaître votre entrée réelle) - ajoutez ceci à la fin de votre commande grep
:
| sed -r 's#.*/(EsbDw[^\.]+).*/([^"]+").*=([^/]+)/>#\1 "\2 \3#'
EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"
-r
utilise ERE pour ne pas avoir à échapper à ()
et +
s#old#new#
remplace old
par new
.*/
tous les caractères précédant un /
(EsbDw[^\.]+)
trouve un motif commençant par EsbDw
et se terminant par .
et enregistre tout avant le .
/([^"]+")
tous les caractères compris entre /
et "
- tout enregistrer après /
, y compris "
=([^/]+)/>
enregistrez ce qui se passe entre =
et />
\1 "\2 \3
les trois modèles enregistrés avec des espaces entre eux (et en ajoutant un "
)