Script -- sostituzione stringhe

Area di discussione libera.

Moderatore: Staff

Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
wakkokid
Linux 2.x
Linux 2.x
Messaggi: 339
Iscritto il: gio 27 gen 2005, 0:00
Kernel: 2.6.3*
Desktop: Kde4
Distribuzione: Debian
Contatta:

Script -- sostituzione stringhe

Messaggio da wakkokid »

Salve,
Ho dei file contenenti dei dati separati dal carattere "tab" di questo tipo:

Codice: Seleziona tutto

1	1050		-41		-76		78
1	1051		-43		-78		85
10	1049		-21		-56		106
10	1050		-21		-56		106
10	1051		-21		-56		105
9	1049		-18		-53		10
Dovrei sostituire gli uno della prima colonna con degli 8.
Come fare?
So che dovrei impararmi la sintassi delle regual expression, ma il problema è a monte: non so cosa dirgli di cercare: se cerco le corrispondenze dei caratteri "1<tab>"
mi troverebbe anche la terza, quarta, quinta riga dell'esempio...
e poi, una volta trovate le righe corrispondenti, che comando posso usare per modificare il primo carattere di quella riga da 1 a 8?

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Script -- sostituzione stringhe

Messaggio da anycolouryoulike »

Così?

Codice: Seleziona tutto

sed 's/^1\( \+\)/8\1/'

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: Script -- sostituzione stringhe

Messaggio da conraid »

Codice: Seleziona tutto

sed -i s/^1[tab]*/8/g nomefile

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Script -- sostituzione stringhe

Messaggio da anycolouryoulike »

conraid ha scritto:

Codice: Seleziona tutto

sed -i s/^1[tab]*/8/g nomefile
Mi sembra di aver capito che voglia sostituire solo gli 1 non i 10, 11...
Ma quel [tab] è roba di Bash di Sed o di che cosa?

Avatar utente
wakkokid
Linux 2.x
Linux 2.x
Messaggi: 339
Iscritto il: gio 27 gen 2005, 0:00
Kernel: 2.6.3*
Desktop: Kde4
Distribuzione: Debian
Contatta:

Re: Script -- sostituzione stringhe

Messaggio da wakkokid »

No, non così perchè ad esempio, mi trasforma i "10" in "80", io vorrei che l'"1" diventi "8" ma i "10" restino "10"
Per il momento ho risolto con uno scripg in php, ma la domanda resta valida perchè credo che a saper usare la shell ci avrei messo la metà del tempo...

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Script -- sostituzione stringhe

Messaggio da anycolouryoulike »

No aspetta, quel [tab] verifica o una t o una a o una b, non significa tab.
L'espressione regolare nel tuo esempio è verificata solo grazie al *.
Per indicare il tab ci sono le estensioni POSIX:
[:blank:] verifica uno spazio o un carattere di tabulazione.
[:space:] verifica i caratteri di spaziatura (spazio e tabulazione orizzontale).

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Script -- sostituzione stringhe

Messaggio da anycolouryoulike »

wakkokid ha scritto:No, non così perchè ad esempio, mi trasforma i "10" in "80", io vorrei che l'"1" diventi "8" ma i "10" restino "10"
Per il momento ho risolto con uno scripg in php, ma la domanda resta valida perchè credo che a saper usare la shell ci avrei messo la metà del tempo...
Il mio non ti trasforma i 10 in 80...

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: Script -- sostituzione stringhe

Messaggio da conraid »

Fermi un attimo.
Il mio non era un codice "valido" ma un modo per dire di usare ^ per l'inizio come aveva domandato. Il [tab] era per segnalare che c'era un [tab] come il suo <tab>, tutto qui.

anycolouryoulike il tuo non mi modifica niente

Prova così

Codice: Seleziona tutto

sed -i 's/^1\t/8\t/g' nomefile
anche se quel \t rischia forse di non essere "portabile"

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Script -- sostituzione stringhe

Messaggio da anycolouryoulike »

conraid ha scritto:anycolouryoulike il tuo non mi modifica niente
Grazie al cavolo... :)
Però ti stampa a video il risultato!
Per modificare basta aggiungere -i.

Il tuo semmai non verifica niente:

Codice: Seleziona tutto

$ cat prova
1   1050      -41      -76      78
1   1051      -43      -78      85
10   1049      -21      -56      106
10   1050      -21      -56      106
10   1051      -21      -56      105
9   1049      -18      -53      10
$ sed 's/^1\t/8\t/g' prova
1   1050      -41      -76      78
1   1051      -43      -78      85
10   1049      -21      -56      106
10   1050      -21      -56      106
10   1051      -21      -56      105
9   1049      -18      -53      10

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: Script -- sostituzione stringhe

Messaggio da conraid »

Per non ripetere il tab nella stringa di sostituzione
in posix

Codice: Seleziona tutto

sed -e 's/^1\([[:space:]]\)/8\1/g' nomefile
altrimenti

Codice: Seleziona tutto

sed -e 's/^1\(\t\)/8\1/g' nomefile
Ma non sono esperto di sed ed regxep

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: Script -- sostituzione stringhe

Messaggio da conraid »

Grazie al cavolo... :)
Però ti stampa a video il risultato!
Per modificare basta aggiungere -i.
Che non sono esperto l'ho detto, ma non prendermi per scemo, so cosa vuol dire -e (default) e -i

Codice: Seleziona tutto

$ cat prova2
1       1050            -41             -76             78
1       1051            -43             -78             85
10      1049            -21             -56             106
10      1050            -21             -56             106
10      1051            -21             -56             105
9       1049            -18             -53             10
$ sed 's/^1\( \+\)/8\1/' prova2
1       1050            -41             -76             78
1       1051            -43             -78             85
10      1049            -21             -56             106
10      1050            -21             -56             106
10      1051            -21             -56             105
9       1049            -18             -53             10
$ sed 's/^1\t/8\t/g' prova2
8       1050            -41             -76             78
8       1051            -43             -78             85
10      1049            -21             -56             106
10      1050            -21             -56             106
10      1051            -21             -56             105
9       1049            -18             -53             10
$ sed 's/^1\([[:space:]]\)/8\1/g' prova2
8       1050            -41             -76             78
8       1051            -43             -78             85
10      1049            -21             -56             106
10      1050            -21             -56             106
10      1051            -21             -56             105
9       1049            -18             -53             10
$ sed 's/^1\(\t\)/8\1/g' prova2
8       1050            -41             -76             78
8       1051            -43             -78             85
10      1049            -21             -56             106
10      1050            -21             -56             106
10      1051            -21             -56             105
9       1049            -18             -53             10
A questo va capito il diverso comportamento

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: Script -- sostituzione stringhe

Messaggio da conraid »

Nel server mi da comportamenti diversi

Codice: Seleziona tutto

# sed 's/^1\t/8\t/g' prova
1   1050      -41      -76      78
1   1051      -43      -78      85
10   1049      -21      -56      106
10   1050      -21      -56      106
10   1051      -21      -56      105
9   1049      -18      -53      10
# sed -e 's/^1\([[:space:]]\)/8\1/g' prova
8   1050      -41      -76      78
8   1051      -43      -78      85
10   1049      -21      -56      106
10   1050      -21      -56      106
10   1051      -21      -56      105
9   1049      -18      -53      10
# sed -e 's/^1\(\t\)/8\1/g' prova
1   1050      -41      -76      78
1   1051      -43      -78      85
10   1049      -21      -56      106
10   1050      -21      -56      106
10   1051      -21      -56      105
9   1049      -18      -53      10
# sed 's/^1\( \+\)/8\1/' prova
8   1050      -41      -76      78
8   1051      -43      -78      85
10   1049      -21      -56      106
10   1050      -21      -56      106
10   1051      -21      -56      105
9   1049      -18      -53      10
eppure uso BASH in entrambi i casi, sempre la stessa della 12.1

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Script -- sostituzione stringhe

Messaggio da anycolouryoulike »

Non ti sto prendendo per scemo! Avevo capito male, scusa.
Avevo fatto copia e incolla del testo senza sostituire gli spazi con i tab... #-o
Quindi invece di " \+" (uno o più spazi) "[:space:]" (spazio o tabulazione).
Giusto.
Probabilmente nel server anche tu hai gli spazi, non i tab.

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: Script -- sostituzione stringhe

Messaggio da conraid »

anycolouryoulike ha scritto:Probabilmente nel server anche tu hai gli spazi, non i tab.
:oops:
anycolouryoulike ha scritto: Non ti sto prendendo per scemo! Avevo capito male, scusa.
Ma figurati, mancava la faccina al mio post, ma non ero offeso :-)
Ultima modifica di conraid il mer 2 lug 2008, 15:29, modificato 1 volta in totale.

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: Script -- sostituzione stringhe

Messaggio da anycolouryoulike »

conraid ha scritto:Offtopic: Anche il find ho notato che ha comportamenti diversi quando uso per esempio -name "qualcosa*". Da cosa può dipendere?
Secondo me non è questione di server o non server...
Prova a fare PROVA=*.txt e poi echo $PROVA. Se viene espansa vuol dire che hai dei file .txt nella directory corrente e find non distingue il percorso dall'espressione.

La cosa è comica però.
Io dicevo che le tue espressioni erano sbagliate perché avevo gli spazi.
Tu dicevi che le mie espressioni erano sbagliate perché avevi i tab.
Senza esempi avremmo potuto continuare all'infinito.

Rispondi