Pagina 1 di 2

Aiuto per comandino

Inviato: mar 13 gen 2009, 10:57
da Szat
Ciao ragazzi

ho un problemuccio con slackyd:

se da shell do il comando:

#slackyd -s > file.txt

ottengo come output un file così formattato:

Codice: Seleziona tutto

Searching all: found 1738 packages.
Sorting packages: done.

3ddesktop-0.2.9-i486-2sl.tgz [from slacky]
a2ps-4.13b-i386-2.tgz [from slackware]
a52dec-0.7.4-i486-3sl.tgz [from slacky]
aaa_base-12.2.0-noarch-1.tgz [from slackware]
aaa_elflibs-12.2.0-i486-1.tgz [from slackware]
aaa_terminfo-5.6-noarch-1.tgz [from slackware]
aalib-1.4rc5-i486-2.tgz [from slackware]
abakus-0.91-i486-2as.tgz [from slacky]
acct-6.4pre1-i486-1.tgz [from slackware]
acetoneiso-2.0.3rc1-i686-1as.tgz [from slacky]
acl-2.2.47_1-i486-1.tgz [from slackware]
acpid-1.0.8-i486-2.tgz [from slackware]
acpitool-0.4.7-i486-2bj.tgz [from slacky]
addiktui-1.04-i486-4as.tgz [from slacky]
adesklets-0.6.1-i486-3gal.tgz [from slacky]
[cut altri pacchetti]
zenity-2.24.0-i486-1as.tgz [from slacky]
zhu3d-4.1.8-i686-1as.tgz [from slacky]
zlib-1.2.3-i486-2.tgz [from slackware]
zoo-2.10-i486-1.tgz [from slackware]
zope.interface-3.3.0-i486-2sl.tgz [from slacky]
zsh-4.3.6-i486-1.tgz [from slackware]
Ora con
$cat list.txt | grep tgz > prova.txt

riesco a eliminare le prime 3 righe ma ora vorrei eliminare anche il -*.tgz * in modo da avere solo più il nome del pacchetto

come posso fare?

Grazie in anticipo

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 11:03
da targzeta
Szat ha scritto:...ma ora vorrei eliminare anche il -*.tgz * in modo da avere solo più il nome del pacchetto...
In italiano, questa frase, che significa? E' difficile aiutarti se non si capisce che vuoi fare :)

Spina

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 11:25
da Szat
spina ha scritto:In italiano, questa frase, che significa? E' difficile aiutarti se non si capisce che vuoi fare :)
Spina
Il file è formattato così:

aaa_base-12.2.0-noarch-1.tgz [from slackware]

vorrei che diventasse su solo aaa_base togliendo il -12.2.0-noarch-1.tgz [from slackware]

Si capisce?

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 11:36
da danix
vado a memoria ma basename dovrebbe tornarti utile, fai il parsing riga per riga e dopo averlo dato in pasto a basename lo fai scrivere in un nuovo file di testo... ;)

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 12:02
da targzeta
Szat ha scritto:...vorrei che diventasse su solo aaa_base togliendo il -12.2.0-noarch-1.tgz [from slackware]

Si capisce?
Ora si :D.

Fai attenzione perchè, in generale, il nome del pacchetto non lo trovi eliminando tutto ciò che sta dopo il primo trattino, alcuni pacchetti hanno anche il trattino come parte integrante del nome. Un buon algoritmo parte dalla fine ed elimina '-*' poi di nuovo '-*' e poi ancora '-*'. Con un esempio:

Codice: Seleziona tutto

a52dec-0.7.4-i486-3sl.tgz [from slacky]
dovrebbe diventare prima:

Codice: Seleziona tutto

a52dec-0.7.4-i486
poi:

Codice: Seleziona tutto

a52dec-0.7.4
ed infine:

Codice: Seleziona tutto

a52dec
Aggiungo anche che non hai bisogno di parsare il file due volte, la prima volta per eliminare le prime tre righe e poi la seconda per eliminare tutto ciò che non ti interessa dal nome del pacchetto. Puoi parsare il file solo una volta ed ottenere in output quello che desideri.

Ora non sono su Slackware, se non ci riesci tu, ti posto una soluzione stasera,
Spina

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 12:07
da conraid
in installpkg c'è questa funzione

Codice: Seleziona tutto

package_name() {
  STRING=`basename $1 .tgz`
  # Check for old style package name with one segment:
  if [ "`echo $STRING | cut -f 1 -d -`" = "`echo $STRING | cut -f 2 -d -`" ]; then
    echo $STRING
  else # has more than one dash delimited segment
    # Count number of segments:
    INDEX=1
    while [ ! "`echo $STRING | cut -f $INDEX -d -`" = "" ]; do
      INDEX=`expr $INDEX + 1`
    done
    INDEX=`expr $INDEX - 1` # don't include the null value
    # If we don't have four segments, return the old-style (or out of spec) package name:
    if [ "$INDEX" = "2" -o "$INDEX" = "3" ]; then
      echo $STRING
    else # we have four or more segments, so we'll consider this a new-style name:
      NAME=`expr $INDEX - 3`
      NAME="`echo $STRING | cut -f 1-$NAME -d -`"
      echo $NAME
      # cruft for later ;)
      #VER=`expr $INDEX - 2`
      #VER="`echo $STRING | cut -f $VER -d -`"
      #ARCH=`expr $INDEX - 1`
      #ARCH="`echo $STRING | cut -f $ARCH -d -`"
      #BUILD="`echo $STRING | cut -f $INDEX -d -`"
    fi
  fi
}
quindi se fossi in te farei uno script così

Codice: Seleziona tutto

STRING=`basename $1 .tgz`
INDEX=1
while [ ! "`echo $STRING | cut -f $INDEX -d -`" = "" ]; do
  INDEX=`expr $INDEX + 1`
done
INDEX=`expr $INDEX - 1`
if [ "$INDEX" = "2" -o "$INDEX" = "3" ]; then
  echo $STRING
else
  NAME=`expr $INDEX - 3`
  NAME="`echo $STRING | cut -f 1-$NAME -d -`"
  echo $NAME
fi
chiamato come vuoi, per esempio nomepkg.sh

da richiamare con

Codice: Seleziona tutto

./nomepkg.sh PACCHETTO
quindi per esempio

Codice: Seleziona tutto

$ ./nomepkg.sh zsh-pippo-4.3.6-i486-1.tgz
zsh-pippo
$ ./nomepkg.sh zsh-4.3.6-i486-1.tgz
zsh

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 13:06
da puzuma
conraid ha scritto: quindi se fossi in te farei uno script così

Codice: Seleziona tutto

STRING=`basename $1 .tgz`
INDEX=1
while [ ! "`echo $STRING | cut -f $INDEX -d -`" = "" ]; do
  INDEX=`expr $INDEX + 1`
done
INDEX=`expr $INDEX - 1`
if [ "$INDEX" = "2" -o "$INDEX" = "3" ]; then
  echo $STRING
else
  NAME=`expr $INDEX - 3`
  NAME="`echo $STRING | cut -f 1-$NAME -d -`"
  echo $NAME
fi
in realtà basta che fai così:

Codice: Seleziona tutto

echo ${1%%-*}
e ottieni lo stesso risultato

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 13:33
da conraid
puzuma ha scritto: in realtà basta che fai così:

Codice: Seleziona tutto

echo ${1%%-*}
e ottieni lo stesso risultato

Codice: Seleziona tutto

$ cat nome.pkg
echo ${1%%-*}
$ sh nome.pkg zsh-pippo-4.3.6-i486-1.tgz
zsh
e non
zsh-pippo

ho sbagliato qualcosa o intendevi altro?

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 14:04
da shark1500
Avevo fatto uno script poco fa al volo (per una cosa del genere).

Fregandomene del trattino nel nome del file (ho avuto solo un caso su 80 pacchetti controllati).

Codice: Seleziona tutto

echo aaa_base-12.2.0-noarch-1.tgz | gawk -F'-' '{ print $1 }'
Per farlo con il trattino fai come ha fatto conraid (piu' raffinato sicuramente :-))

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 15:43
da anycolouryoulike

Codice: Seleziona tutto

sed 's/\(.\+\)\(-[^-]\+\)\{3\}\.tgz .*/\1/'

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 15:56
da conraid
shark1500 ha scritto:Per farlo con il trattino fai come ha fatto conraid (piu' raffinato sicuramente :-))
L'ha fatto Pat non io :-)
Ho solo tolto delle parti che servono per i vecchi pacchetti

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 15:58
da conraid
conraid ha scritto:
shark1500 ha scritto:Per farlo con il trattino fai come ha fatto conraid (piu' raffinato sicuramente :-))
L'ha fatto Pat non io :-)
Ho solo tolto delle parti che servono per i vecchi pacchetti
Comunque c'è più di un caso, alcuni anche due trattini

Codice: Seleziona tutto

tango-icon-theme-0.8.1-noarch-1
xf86-input-evdev-2.0.8-i486-1
e tutti input etc...
xorg-server-xvfb-1.4.2-i486-1
xorg-sgml-doctools-1.2-noarch-1

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 18:37
da sixjan
Considerando che il nome è sempre il 4° campo contando da destra, si può usare rev:

Codice: Seleziona tutto

#!/bin/bash

echo $1 | rev | cut -f4-10 -d- | rev


:~$ echo tango-icon-theme-0.8.1-noarch-1.tgz | rev | cut -f4-10 -d- | rev
tango-icon-theme

Abbondo in -f4-10, così prendo nomi con più trattini. Ciao.

Re: Aiuto per comandino

Inviato: mar 13 gen 2009, 20:37
da targzeta
sixjan ha scritto:...
:~$ echo tango-icon-theme-0.8.1-noarch-1.tgz | rev | cut -f4-10 -d- | rev
tango-icon-theme

Abbondo in -f4-10, così prendo nomi con più trattini. Ciao.
Per essere più corretto dovresti usare '-f4-', in questo modo stai tranquillo qualsiasi siano i trattini nel nome del pacchetto.

Comunque anycolouryoulike ha implementato esattamente quello che volevo fare io. Quindi se l'output di slackyd è nel file casa, basta fare:

Codice: Seleziona tutto

sed -n '/\.tgz/{s/\(.\+\)\(-.\+\)\{3\}/\1/;p}' casa
Spina

Re: Aiuto per comandino

Inviato: mer 14 gen 2009, 11:39
da sixjan
spina ha scritto:
sixjan ha scritto:...
:~$ echo tango-icon-theme-0.8.1-noarch-1.tgz | rev | cut -f4-10 -d- | rev
tango-icon-theme

Abbondo in -f4-10, così prendo nomi con più trattini. Ciao.
Per essere più corretto dovresti usare '-f4-', in questo modo stai tranquillo qualsiasi siano i trattini nel nome del pacchetto.

Spina
Sì, vero. Grazie per la correzione. Saluti.