Pagina 1 di 2

Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 13:32
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?

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 14:02
da anycolouryoulike
Così?

Codice: Seleziona tutto

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

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 14:15
da conraid

Codice: Seleziona tutto

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

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 14:23
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?

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 14:29
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...

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 14:30
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).

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 14:30
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...

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 14:42
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"

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 15:02
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

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 15:03
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

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 15:05
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

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 15:16
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

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 15:18
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.

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 15:19
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 :-)

Re: Script -- sostituzione stringhe

Inviato: mer 2 lug 2008, 15:32
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.