2010-09-18 7 views
0

je le fichier d'entrée suivant que vous pourriez reconnaître comme un fichier debian Packages:combiner deux lignes particulières avec sed

Package: nimbox-apexer-sales 
Version: 1.0.0-201007241449 
Architecture: i386 
Maintainer: Ricardo Marimon <[email protected]> 
Installed-Size: 124 
Depends: nimbox-apexer-root 
Filename: binary/nimbox-apexer-sales_1.0.0-201007241449_i386.deb 
Size: 68880 
MD5sum: c4538f2913d76b57110ba73d0b87cc16 
Section: base 
Priority: optional 
Description: Sales Application for NiMbox. 

Package: nimbox-tomcat 
Version: 6.0.26-5 
Architecture: i386 
Maintainer: Ricardo Marimon <[email protected]> 
Installed-Size: 6144 
Depends: sun-java6-jdk 
Filename: binary/nimbox-tomcat_6.0.26-5_i386.deb 
Size: 5490024 
MD5sum: 5f2ccbe6137af2842e1c81bc217444e3 
Section: base 
Priority: optional 
Description: Tomcat Servlet Application Server for NiMbox 
NiMbox requires a servlet application server in order to work. The current 
NiMbox implementation requires a Tomcat Servlet Application. 

Le fichier a fait un grand nombre de ces entrées et je veux obtenir le fichier suivant

nimbox-apexer-sales 1.0.0-201007241449 
nimbox-tomcat 6.0.26-5 

Lorsque le Package et Version sont séparés par un tab afin que je puisse utiliser plus tard cut pour les obtenir. Je suis assez sûr que cela peut être fait avec sed. Je suis allé au-dessus des paquebots, mais c'est probablement un peu plus complexe. Des idées?

Répondre

1

Lorsque vous travaillez avec Debian fichiers Packages, vous pourriez trouver grep-dctrl utile. Il est incroyablement flexible dans les deux façons dont il permet de limiter les sorties de données , ainsi que dans la façon de le sortir. Au lieu d'essayer d'analyser moi-même les paquets format de fichier, je demande juste grep-dctrl de le faire pour moi, et imprimer uniquement les bits d'information si je suis réellement intéressé par:

$ grep-dctrl -n -s Package,Version nimbox /var/lib/apt/lists/..._Packages 

Cela vous donnera quelque chose comme:

nimbox-apexer-sales 
1.0.0-201007241449 

nimbox-tomcat 
6.0.26-5 

avec cela, il est seulement une question de joindre les lignes droites ensemble, ce qui est assez facile avec, par exemple, perl:

$ ... |perl -pi -0e's/(?<!^)\n(?!\n)/ /mg; s/\n\n/\n/g' 
nimbox-apexer-sales 1.0.0-201007241449 
nimbox-tomcat 6.0.26-5 

ou tout autre ensemble d'outils UNIX standard que vous aimez.

Il est certainement possible d'aller directement du format de fichier Packages à ce que vous voulez , mais l'utilisation d'outils spécialisés pour le travail me semble être une bonne idée.

+0

Grande commande grep-dctrl. – rmarimon

+0

Actuellement réglé pour 'Package grep-dctrl -n -s, Version nimbox Packages | coller -s -d "\ t \ n" ' – rmarimon

1

En supposant que votre nom de fichier est test.txt:

grep -P '^Package: |^Version:' test.txt | awk '{ print $2 }' | sed -e 'N;s/\n/ /' 

Où:

  1. grep -P '^ Paquet: |^Version:' - greps pour les lignes commençant par « Paquet : 'ou 'version:'
  2. awk '{print $ 2}' - bandes 'paquet:' et 'version:' du résultat sous-chaînes
  3. s ed -e 'N; s/\ n//' - chaque rejoint autre ligne
+0

Fonctionne magnifiquement aussi. Doit donner la réponse à @rafl juste pour la découverte 'grep-dctrl'. – rmarimon

0

utilisant RPM, la solution aurait été:

rpm -qa --queryformat "%{NAME}\t%{VERSION}\n" 

Tant pis pour le défi sed.

1

solution sed pure (en utilisant FreeBSD sed sous Mac OS X):

# See: 
# http://sed.sourceforge.net/sedfaq3.html#s3.3: ... (6) Relentless ... 
# http://sed.sourceforge.net/sed1line.txt: ... # if a line begins with ... 

sed -n '/^Package:/{ 
:a 
N 
/\nVersion:/!ba 
p 
}' file | 
sed -E -e :a -e $'$!N;s/\\nVersion: */\t/;ta' -e 'P;D' | 
sed -e 's/^Package: *//' 
1

Voici une version sed:

sed -ne 's/Package: \(.*\)/\1/p' 
     -ne 's/Version: \(.*\)/\1/p' < filename 
     | sed 'N;s/\n/ /g' 
+0

Fonctionne magnifiquement. Va changer la commande de collage que j'avais pour la dernière partie de votre commande sed. Merci !!! – rmarimon

0

Cela pourrait fonctionner pour vous:

sed '/Package:/!d;N;s/^[^ ]* //mg;y/\n/\t/' filename 
nimbox-apexer-sales  1.0.0-201007241449 
nimbox-tomcat 6.0.26-5 

Aussi, si vous remarquez que la même information peut être recueillie à partir de la ligne Filename::

sed '/Filename:/!d;s,.*/\([^_]*\)_\([^_]*\).*,\1\t\2,' filename 
nimbox-apexer-sales  1.0.0-201007241449 
nimbox-tomcat 6.0.26-5 

Ceci peut être spécifique à GNU sed!

Questions connexes