Newsgroup: it.comp.os.linux.iniziare
Titolo: Domanda su sed

Debbo sostituire _solo_ nella prima istanza (seconda riga in questo caso), in
un file di testo (MsgFile.txt) usando il porting di sed in dos:
%TEXTOS Y MENSAJES,MX,
;
;1 $DATI MOLA
;2 $OSCILLAZIONE TAVOLA IN MANUALE
;3 $TUFFO RAPIDO ESTERNI
;4 $MULTITUFFO RAPIDO
;5 $RASAMENTO
cosï¿œ:   ------------------------------------
                                            |
%TEXTOS Y MENSAJES,MX,                      |
;[CO999995],0          <--------------------
;1 $DATI MOLA
;2 $OSCILLAZIONE TAVOLA IN MANUALE
;3 $TUFFO RAPIDO ESTERNI
;4 $MULTITUFFO RAPIDO
;5 $RASAMENTO
Attualmente uso questa soluzione, che funziona solo se la riga vuota (con solo
il carattere ";") ï¿œ singola. Se le righe sono piï¿œ di una, ovviamente la
sostituzione vale anche per le altre che invece non deve avvenire!
sed  "s/^\x3b$/\x3b\[CO999995\]\x2c0/" MsgFile.txt >wgdraw.txt
Ci ho provato in varie salse, ma non ci sono riuscito.
-- 
+---------------------------------------------------------------------------+
| Cagare e crepare non si possono delegare!                                 |
|                                                                           |
+-----#32--------------------Campagna contro le pubblicita` idiote.---------+

 Ci ho provato in varie salse, ma non ci sono riuscito.
forse puoi rifarti alla riga precedente, e aggiungere una riga sotto?
$ sed  "s/^%TEXTOS.*/\0\n\x3b\[CO999995\]\x2c0/" MsgFile.txt
%TEXTOS Y MENSAJES,MX,
;[CO999995],0
;
;
;1 $DATI MOLA
;2 $OSCILLAZIONE TAVOLA IN MANUALE
;3 $TUFFO RAPIDO ESTERNI
;4 $MULTITUFFO RAPIDO
;5 $RASAMENTO
oppure usare un ciclo while e lasciar stare sed?
$ written=0; cat MsgFile.txt | while read row; do test "$row" == ";" -
a "$written" == 0 && echo ";[C0999995],0" && written=1 || echo $row;
done
%TEXTOS Y MENSAJES,MX,
;[C0999995],0


 forse puoi rifarti alla riga precedente, e aggiungere una riga sotto?
Potrebbe essere una buona idea.
In effetti la stringa debbo metterla subito dopo la prima riga di intestazione
e ignorare se nel file piï¿œ avanti vi sono righe con solo il ";".
Lunedi, quando torno in ufficio, vedo se non da problemi.
Spero che la terza riga che rimane, con solo il ";" non dia problemi, e spero
che il porting di sed in ambiente dos che uso, non faccia critiche (non
dovrebbe, mi sembra fatto bene, e non mi ha mai tradito!).
Purtroppo debbo usare la cosa su un pc che ha solo xp!
-- 
+---------------------------------------------------------------------------+
|  Proteggi il tuo bambino con bavaglio e pannolino.                        |
|                                                                           |
+-----#1---------------------Campagna contro le pubblicita` idiote.---------+

 Purtroppo debbo usare la cosa su un pc che ha solo xp!
ovviamente, se sei sicuro che la riga e' sempre la seconda puoi
modificare appena il tuo sed iniziale forzandolo ad agire solo sulla
seconda riga
$ sed "2 s/^\x3b$/\x3b\[CO999995\]\x2c0/" MsgFile.txt
o solo tra due occorrenze...
$ sed "/^%TEXTOS/,/^;$/ s/^\x3b$/\x3b\[CO999995\]\x2c0/" MsgFile.txt
ti lascio il link del miglior tutorial (imho) su sed che c'e' in rete
cosi' la sera, se non ti addormenti...
file:///home/antoniomac5/Desktop/linux/Linux_Vario/SedAwkRegEx/sed/Sed.html

 file:///home/......./Desktop/linux/Linux_Vario/SedAwkRegEx/sed/Sed.html
Uh? Hai la home condivisa ?
Hai danche elle belle "sgnacchere" li dentro?  ;-)))))
-- 
+---------------------------------------------------------------------------+
|  Negli ultimi 3 mesi, 25 tamponamenti per leggere questo cartello.        |
|  Guarda avanti, idiota!                                                   |
+-----#2---------------------Campagna contro le pubblicita` idiote.---------+

 sed  "s/^\x3b$/\x3b\[CO999995\]\x2c0/" MsgFile.txt >wgdraw.txt
Non uso il DOS da tanto tempo ma il punto e virgola e la virgola 
si possono usare nelle virgolette; forse è un qualche difetto della 
versione di sed che usi?. comunque:
sed "/^%TEXTOS Y MENSAJES\,MX\,$/  {n;s/^;$/&pippo/}" ...

 sed "/^%TEXTOS Y MENSAJES\,MX\,$/  {n;s/^;$/&pippo/}" ...
Su linux funziona, lunedi in ufficio lo provo, ma penso che funzioni pure li.
Grazie comunque anche a te.
-- 
+---------------------------------------------------------------------------+
|  Se sei stanco, fermati e fatti fare una pompa.                           |
|                                                                           |
+-----#3---------------------Campagna contro le pubblicita` idiote.---------+

 
cd ../../../Desktop/sgnacchere/Pamela.mov

 nell'uso delle doppie virgolette, al posto di quelle semplici), ho fatto un
dos e sed mi sembrano abbastanza due ossimori... sicuro che la 
differenza sia solo in quello?
perche' non usi piuttosto una linux live e una chiavetta USB formattata 
FAT32?

> sed "/^%TEXTOS Y MENSAJES\,MX\,$/  {n;s/^;$/&pippo/}" ...
se pero' subito dopo la riga "TEXTOS" non ha un ; ...
%TEXTOS Y MENSAJES,MX,
%TEXTOS Y MENSAJES,MX,BIS
;


 dos e sed mi sembrano abbastanza due ossimori
a me sembrano uno solo :)

 se pero'  ...
Zitto tu.
La domanda era poco chiara e le tue obiezioni contano quanto il 
cavallo di denari a poker.

 ...
Ripetitivo

 ...
1) Tacere? No, eh.
2) *UN* ossimoro.
3) Usavo sed e grep su IBM-DOS 3,22
4) Esistono i porting, non lo sai?
5) Sai che il sed di Linux ed il sed di Solaris sono diversi?
6) Sai che il sed di Linux ed il sed di HP-Unix sono diversi?
7) DOS ha copiato a man bassa da UNIX. Non è uno scandalo anche UNIX 
   ha copiato a man bassa da MULTICS, CTSS et cetera.
8) Basta così perché mi annoio.

 cd ../../../Desktop/sgnacchere/Pamela.mov
LOL 

 cavallo di denari a poker.
Calma ragazzi!
La doppia intestazione non mi e' mai capitata di vederla, come pure 2 righe
immediatamente dopo l'intestazione, con entrambe il punto e virgola.
Mi e' capitato invece di vedere in un paio di files alla 30esima e passa riga
una con solo il punto e virgola ed era questo il motivo per cui avevo posto il
quesito.
Come ho detto, lunedi' verifico le soluzioni che avete posto.
-- 
+---------------------------------------------------------------------------+
|ma che te frega dei virus e l'illegalita',                                 |
|importante e' vedere 22 miliardari drogati che corrono appresso a na palla.|
+-----#15--------------------Campagna contro le pubblicita` idiote.---------+

 FAT32?
Perche' faccio pure assistenza telefonica ai clienti, e se mi capita di operare
su una directory mandata sul momento da un cliente, mentre sono con lui al
telefono, riavviare il pc con la chiavetta, modificare il file incriminato,
riavviare il pc senza la chiavetta, riconnettere la rete interna, avviare il
programma visualizzatore per poter vedere quello che il cliente vede in quel
momento sullo schermo del controllo numerico, ci perdo troppo tempo!
Ci avevo pensato (mi ero gia' fatto un paio di cd con un paio di live), ma ho
dovuto scartare l'idea.
Invece l'accrocchio che uso, mi basta avviare una icona a cui ho abbinato un
batch, scelgo con le frecce, la directory dove ho salvato quanto inviato dal
cliente, oppure quella in cui debbo aggiornare il file maledetto ed il resto
avviene tutto in automatico. Avvio il programma visualizzatore della pagina
grafica e sono a bolla. Il tutto in una manciata scarsa di secondi.
Si lo so, non lo avevo detto, perche' non mi sembrava parte fondamentale del
problema.


 Perche' ...
Ma gli rispondi pure!
Però anche tu a postare su .linux una domanda su DOS.
No, scherzo ;-)

> sed "1,/^;$/ s/^;$/;[CO999995\],0/"
     ~~~~~~~
baco
lui dice di voler sostituire la prima, e solo la prima, occorrenza di
un ; iniziale
con la riga che hai scritto tu, se c'e' un ; nella prima riga e un ;
nella seconda, li sostituira' entrambi
$ echo -e ";\n;" | sed "1,/^;$/ s/^;$/;[CO999995\],0/"
;[CO999995],0
;[CO999995],0
$ echo -e ";\n;" | sed "0,/^;$/ s/^;$/;[CO999995\],0/"
;[CO999995],0
;
questo ovviamente con GNU-sed

 sed "1,/^;$/ s/^;$/;[CO999995\],0/"
non trovi curioso il fatto che decine di righe, per giunta poco
chiare, nel linguaggio "umano" si traducano in una sola riga, per
giunta inequivocabile, nel linguaggio "macchina"?

 Come ho detto, lunedi' verifico le soluzioni che avete posto.
l'unica cosa che mi sento ancora di dirti e' di stare attento a
possibili spzi (o tabulazioni...) successive al punto e virgola
se ci sono, tu con gli occhi "umani" faresti fatica a vederle, ma agli
"occhi del computer" non sfuggirebbero, e potrebbero rendere una
espressione regolare tipo
^;$
non valida... su GNU-sed si puo' sostituire con un piu' sicuro
^;[[:space:]]*$
sembrerebbe che la cosa faccia parte dello standard imposto da POSIX
$ echo -e ";\t" | sed --posix 's/^;[[:space:]]*$/ok/'
ok
bisogna vedere pero' se la microsoft ha chinato o meno la testa di
fronte a POSIX

 questo ovviamente con GNU-sed
Ecco, su GNU sed e solo con GNU sed. 
Se vuoi una soluzione portabile, cioè che funzioni anche su 
altri sistemi operativi, scrivi 1,...

 altri sistemi operativi, scrivi 1,...
che "non" funzioni anche su altri sistemi operativi, vorrai dire
ti dimentichi che usando 1 c'e' un piccolo bug
e comunque GNU-sed e' open-source... chiunque puo' compilarselo per la
sua piattaforma
non si capisce perche' si debba tener conto di altre versioni quando
la piu' diffusa (e forse anhce la migliore?) e' quella della FSF
a parte questo, a me risulta che si possa usare 0 anche nella versione
POSIX
$ echo -e ";\n;" | sed --posix "0,/^;$/ s/^;$/;OK/"
;OK
;
e che anche nella versione POSIX, usando 1 si verifica quel piccolo
bug
$ echo -e ";\n;" | sed --posix "1,/^;$/ s/^;$/;OK/"
;OK
;OK
se cosi' non fosse, faresti bene a spiegare meglio la cosa, perche'
forse si tratta di un piccolo bug di sed... e nel caso andrebbe
segnalato.

 segnalato.
allora, chi sbaglia?
tu, GNU-sed, MS-sed o POSIX?

  ...
Seguendo questo ragionamento allora le uniche automobili sono le 
Ferrari mentre le Porsche e le Mercedes giacciono invendute nei 
magazzini. E tutte le altre fabbriche sono fallite già da tempo.
Ma mi faccia il piacere, torni a Windows!

 magazzini. E tutte le altre fabbriche sono fallite già da tempo.
seguendo il tuo ragionamento, io entro in una concessionaria che 
*REGALA* automobili...
ne ha di diversi modelli... delle 500, delle fiat tipo... e poi ha anche 
delle ferrari
e io che prendo la ferrari dovrei preoccuparmi se tu hai deciso di 
complicarti la vita scegliendo una macchina di qualita' inferiore?

 complicarti la vita scegliendo una macchina di qualita' inferiore?
\end{irony}
Bravo, hai capito la mia obiezione. 

 Bravo, hai capito la mia obiezione. 
bravo, sei riuscito a fare stronzo.

 
e comunque l'OT dovevi metterlo gia' da qui
qui siamo su LINUX iniziare
non su BSD iniziare, o su Microsoft iniziare
e in linux il SED e' UNO SOLO
GNU-sed