Newsgroup: it.comp.os.linux.software
Titolo: É possibile usando solo sed ....

Dunque, ho un programma plc in formato di testo (PLC_PRG.PIT) in cui sono usati
alcuni bit (da B0 a B32) di alcuni registri (R200 fino ad R700).
Il file (circa 1500-2000 righe) contiene tra le tante righe, una certa quantitá
tipo:
M1300 AND (DFU B4R561 OR DFU B12R561 OR CPS R2 EQ 201)
()=B25R501=B12R502=TIMERON
.....
Io debbo estrarre *solo* quelle dei registri da R560 fino a R564, e non solo,
ma debbo fare una lista dei bit usati di ognuno di quei registri.
Il primo approccio, e che funziona é (tutto su una riga) [1]:
cat PLC_PRG.PIT 
| sed 's/B[0-9]\{1,2\}R56[0-9]/\n    &\n/g' 
| | sed '/^    B/!d' | sort | uniq
(Sono giá state poste domande su come estrarre alcune stringhe o parti di esse
da una riga di un file di testo. Questo approccio di usare gli "a capo" mi
sembra abbastanza valido ed adattabile ai molti casi postati recentemente.)
In pratica, non essendoci mai piú di uno spazio tra i caratteri, taglio ogni
singola ricorrenza trovata, con un  "a capo" piú 4 spazi, piú un altro "a
capo", poi filtro le sole righe che cominciano con 4 spazi e la lettera "B".
Il risultato (OK) é del tipo [2]:
    B11R562
    B12R561
    B13R562
    B14R561
    B15R561
    B15R562
    B17R562
Fino a questo punto, funziona tutto, ma io debbo superare uno scoglio, e non ho
idea *se* si puó fare.
Ora debbo fare la cosa piú difficile. Ho un file di testo (13.txt) in cui é
associata la definizione del bit+registro e la sua funzione, tipo [3]:
O12     B14R561
O13     B5R561  TASTO S
O14     B13R561 TASTO N
;
ENTER   B4R560
RECALL  B12R560
PPROG   B20R560
CLEAR   B28R560
ESC     B4R561
RESET   B12R561
Debbo creare un file, dove al posto dei singoli bit+registro[2], vi sia la
relativa descrizione[3], quindi un "replace" di ogni riga, con quella
corrispondente bit+registro, del secondo file. Ossia:
Sostituire una riga con:
    B4R560
con:
ENTER   B4R560
e:
    B5R561
con:
O13     B5R561  TASTO S
Il problema si complica in quanto, la macchina su cui questo ambaradan deve
funzionare, usa windows xp, con una versione dei sed (fatta per altro
abbastanza bene) in modalitá dos.
Se fosse una variabile in input[2], un qualcosa tipo:
cat 13.txt | sed '/    $VARIABILE/!d >> OUTFILE
risolverebbe...
La domanda quindi é la seguente: é possibile usare un file di input[3], per
sostituire una riga in un'altro file[2]?
-- 
+---------------------------------------------------------------------------+
| Da una E-Mail:                                                            |
| La sig.ra MICHELA e' assediata da un cliente per un'urgente commessa che  |
| prevede la rettifica interna                                              |
+-----#18--------------------Campagna contro le pubblicita` idiote.---------+

 risolverebbe...
Lascia perdere ed usa AWK o PERL. Sì sed ha dei comandi per leggere  
da un file o per fare dei cicli ma il mio consiglio è usare sed solo e 
soltanto per fare semplici sostituzioni di testo. Se il grep che ho proposto 
non risolve il tuo problema, non postare la tua soluzione ma descrivi il 
tuo problema.
PS non ci sono gruppi per sed o per windows, quindi ti ho risposto
 anche se sei fuori tema.

corrispondente bit+registro, del secondo file. Ossia:
Con solo sed, no.
Pero', supponendo che il file 13.txt sia tabulato, si puo' ordinare con
sort sul secondo campo:
	sort -k 2.1 < 13.txt > 13s.txt
e il file registri.txt sul primo:
	sort < registri.txt > registris.txt
A questo punto, con join
	join -a 1 -1 1 -2 2 registris.txt 13s.txt
dovresti ottenere quello che ti serve.
Leonardo che garantisce freschezza, non verità
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!

 
è stato testè detto che "sort -u" sortische l'effetto di "sort|uniq"
Ciò detto, ho la vaga impressione che questo dovrebbe esserti
sufficiente:
$ cat PLC_PRG.PIT|awk 'BEGIN {RS=" |   "} /R56[0-4]/{print}'
okkio: dopo RS= ho messo, prima uno spazio vuoto, poi il pipe, e poi un
tab... questo non sapendo che delimitatore hai nel file.
-- 
Wikipedia Admin: "wikipedia non è un blog"
Iosif Stalin: "i compagni hanno scambiato il partito per un circolo di
discussione"

 
Aspetta, correzione. Ho visto che alcune volte il separatore e
anche il segno "uguale".
Quindi:
$ cat PLC_PRG.PIT|awk 'BEGIN {RS=" |   |="} /R56[0-4]/{print}'
sempre occhio al tab se fai copia e incolla.


 $ cat PLC_PRG.PIT|awk 'BEGIN {RS=" |   "} /R56[0-4]/{print}'
  È stato anche detto che questo è un Uso Inutile di CAT!
$ awk 'regexp' file
  Per il resto sottoscrivo quanto ha già scritto mallin: moolto meglio che
impiccarsi per far fare a sed quello che server a BIG (e che anche
funzionasse sarebbe un codice inguardabile e immantenibile), vale molto la
pena farlo con strumenti adeguati alla complessità dell'operazione, ossia
awk o perl o python.
  Ciao,
-- 
Alessandro Selli, 
http://alessandro.route-add.net
AVVERTENZA: i messaggi inviati a "trappola" non mi arriveranno.
WARNING: messages sent to "trappola" will never reach me.
Chiave PGP/GPG: EC885A8B

 
cacchio... perché non me ne sono accorto prima?
Con grep vedo tanti che fanno "cat file | grep <pattern>", quando
invece è più naturale fare "grep <pattern> file"
Sai che ho il dubbio che con AWK vecchio (per intenderci quello non
GNU) potrebbe non funzionare?


 GNU) potrebbe non funzionare?
  Nel qual caso si farebbe awk 'script' < file
  Ciao,
-- 
Alessandro Selli 
http://alessandro.route-add.net


   Nel qual caso si farebbe awk 'script' < file
me tapino! :)


 me tapino! :)
  LOL!  M'aspettavo l'avresti fatto dire da una cow!  :-)
  A proposito, in italiano sarebbe assai più indicato fare un tapirosay.
 C'è qualche perlista disponibile per un fork nostrano?
 ____________________
< Me wannabe tapiro! >
 --------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |


  anche se sei fuori tema.
In effetti una domanda simile era piú indicata su "iniziare", ma quei fetenti
di wind-infostrada hanno bannato il gruppo!
-- 
+---------------------------------------------------------------------------+
|  Proteggi il tuo bambino con bavaglio e pannolino.                        |
|                                                                           |
+-----#1---------------------Campagna contro le pubblicita` idiote.---------+

 dovresti ottenere quello che ti serve.
Ciao, ti ringrazio per la risposta, e la tua elucubrazione funziona, a parte il
piccolo scambio di posizione tra il primo ed il secondo campo.
Ma come ho appena risposto a mallin.shetland, il lavoro sporco lo debbo fare su
un XP, che non ha a disposizione tutti quei bei comandi 'nix!
Grazie comunque per la risposta.


 sempre occhio al tab se fai copia e incolla.
Non funzia! Tira fuori tanta roba che non c'entra.
Provato sulla debian che sto usando ora, ma come ho detto all'inizio, debbo
usare dei programmi 'nix convertiti su un pc con XP e (lo ammetto che la mia
soluzione fa pena) quello che ho "defecato" funziona egregiamente.
Quello mi rimaneva da risolvere, era solo la parte finale, a cui
mallin.shetland mi ha dato la soluzione migliore.
Grazie comunque.


un XP, che non ha a disposizione tutti quei bei comandi 'nix!
Di serie no, ma ci sono gli UnixTool che girano anche su Windows :-)
Leonardo


 Non funzia! Tira fuori tanta roba che non c'entra.
togli il tab: {RS=" |="}


 togli il tab: {RS=" |="}
Si, ovvio, e fatto. Nel file originale, i "tab" non ci sono.
Se ti interessa, posso postare il file originario (su rapidshare), che ci
capiremo meglio.
Il file in effetti é abbstanza complesso...
-- 
+---------------------------------------------------------------------------+
|  Se fai rifornimento dopo le 22,30 aumentiamo i prezzi di soli            |
|  70 centesimi al litro.                                                   |
+-----#7---------------------Campagna contro le pubblicita` idiote.---------+

 
be vai... almeno ci passiamo il tempo :)


 fetenti di wind-infostrada hanno bannato il gruppo!
C'è stato un lungo e polemico thread in proposito su icoli. In definitiva
puoi usare un qualsiasi altro server per le news in aggiunta o alternativo
a 
powernews.libero.it
; ce ne sono sia gratuiti che a pagamento come 
Ethernal September, AIOE, diesel, ...

 Ethernal September, AIOE, diesel, ...
Ho usato anni fa, saltuariamente aioe, in lettura, in quanto, con la stringa
che utilizzo da anni come indirizzo mail, non mi da accesso in scrittura.
P.S. Notato ora. La sign o firma qui sotto, é inserita automaticamente in
maniera pseudo-random, e non ha alcuna attinenza ai post in corso.
-- 
+---------------------------------------------------------------------------+
|I puristi ritengono inopportuno utilizzare driver proprietari sutto Linux, |
|i masochisti amano utilizzare driver Windows sotto Linux... Twisted Evil   |
+-----#19--------------------Campagna contro le pubblicita` idiote.---------+

 ed essendo tutti i software che "debbo usare" sotto windows...
Aggiungo solo che se puoi installare i software che vuoi sul tuo pc puoi 
installarti VirtualBox e usare Linux in finestra :-) ... con tutti i 
suoi bei programmi nativi, la shell con l'autocompletamento ecc ecc
ciao
Mauro

 permesso" o "non trovato").
Su DOS i pipe erano emulati con file temporanei; la soluzione era impostare
FILES =30
Su WindowsNT le pipe anonime non esistono, sono simulate con le named 
pipe che però sono più simili ai socket, e vengono maneggiate con delle 
apposite chiamate di sistema. Sembrerebbe che tu abbia dei problemi di 
permessi ma la mia sfera di cristallo è in riparazione.

 be vai... almeno ci passiamo il tempo :)
http://rapidshare.com/files/436446458/PLC_PRG.PIT
Divertiti!
-- 
+---------------------------------------------------------------------------+
|        Dall'inizio dell'anno 11 morti sulle nostre autostrade.            |
|                         Siete troppo prudenti.                            |
+-----#12--------------------Campagna contro le pubblicita` idiote.---------+

 ()=B25R501=B12R502=TIMERON
credo che per lavorare su windows (lavorare=risolvere problemi) python
sia indispensabile
posto un programmino che fa quel che ti serve (senza gestione degli
errori), ormai giusto per stimolare la tua curiosità
----------------------------------------------------------------------------
from re import findall
# creo una lista che contiene tutte le occorrenze come in
# matches = [ 'B12R562', ..., 'B3R561']
matches = findall(r'B[0-9][0-9]?R56[1234]', file('PLC_PRG.PIT','r').read())
# creo un dizionario, inizialmente vuoto, e lo riempio con le linee
# delle definizioni, indicizzate dalla stringa bit+registro, lette dal
# file
defs = {}
for line in file('definizioni.txt'):
    if line[0] == ';' : continue 
    dummy = line.split() # p.e.: dummy = ['O13', 'B5R561', 'TASTO', 'S']
    defs[dummy[1]] = line
# per ogni elemento nella lista delle occorrenze, verifico che sia la
# prima volta che lo vedo, stampo la sua definizione e cambio il
# valore della definizione di modo che il test fallisca per le
# successive occorrenze della stessa stringa
for item in matches:
    if defs[item]:
        print defs[item]
        defs[item] = False
-------------------------------------------------------------------------
caveat emptor, non ho i file e non l'ho testato...
ciao