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
Re: Script -- sostituzione stringhe
Inviato: mer 2 lug 2008, 14:15
da conraid
Re: Script -- sostituzione stringhe
Inviato: mer 2 lug 2008, 14:23
da anycolouryoulike
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ì
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
altrimenti
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...
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.
Sì
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.