PDA

Visualizza la versione completa : Sostituire carattere preciso in file di testo


Mutato
12-01-2005, 11:57
Ciao, avrei la necessita` di sostituire il carattere numero 31 in un file di testo, intendo quello che sta sulla 31esima colonna.

Il file e` fatto di svariate righe, grazie.

Wave
12-01-2005, 12:06
nn ho capito...tu hai un file con un carattere per riga e vuoi sostituire il carattere numero 31= quello sulla 31 riga??? :master:

non è molto chiara la richiesta..

Mutato
12-01-2005, 13:35
No, ho un file strutturato in righe e colonne, il carattere che sta sulla colonna 31 (che e` uno spazio) va sostituito con un altro carattere.

tipo



40133 55100 nonews.org
56040 89398 frequenze.it
40478 89479 openclose.it


lo spazio (carattere colonna 12) tra i numeri e il dominio va sostituito con un carattere.

Sergio Pedone
12-01-2005, 13:55
Per ora ho ottenuto quello che chiedi con una sola linea di testo, ma sto cercando di trattare un file intero... :incupito:

Kamui
12-01-2005, 14:16
L'ho fatto al volo e ti sostituisce tutti gli spazi con un trattino, anzichè solo il secondo spazio (o carattere 12), in ogni caso illustra come trattare ogni riga di un file :D così Sergio può modificare il suo script e tu dovresti ottenere il tuo scopo :zizi:




#!/bin/sh

while read riga; do
echo ${riga//' '/'-'}
done

exit 0




[sly@sid]~ $cat domini.txt
40133 55100 nonews.org
56040 89398 frequenze.it
40478 89479 openclose.it
[sly@sid]~ $cat domini.txt | ./programming/sh/sostituiscicarattere.sh
40133-55100-nonews.org
56040-89398-frequenze.it
40478-89479-openclose.it

Lasher
12-01-2005, 14:26
Originariamente inviato da Kamui
L'ho fatto al volo e ti sostituisce tutti gli spazi con un trattino, anzichè solo il secondo spazio (o carattere 12), in ogni caso illustra come trattare ogni riga di un file :D così Gianiaz può modificare il suo script e tu dovresti ottenere il tuo scopo :zizi:

Quello che hai fatto tu però è una visualizzazione; il risultato ottenuto non è salvato sul file. Credo che sed faccia al caso nostro, però non so usare quel comando :cry:

maiosyet_2
12-01-2005, 14:32
Originariamente inviato da Lasher
Quello che hai fatto tu però è una visualizzazione; il risultato ottenuto non è salvato sul file.

E' sufficiente reindirizzare l'output su file


cat domini.txt | ./script.sh > domini2.txt

Sergio Pedone
12-01-2005, 14:38
Eccomi qua!
Questo scriptino ti permette di sostituire un carattere e solo quello specificato in una particolare posizione, all'interno di un file di test passato come argomento tramite una pipe.
Ovviamente è solo un piccolo esercizio, adattalo alle tue esigenze.

Allego il sorgente:


[sergio@winnie ~]$ cat subst_char.sh
#!/bin/bash
#
# sostituisce un solo carattere nella posizione n-esima
#

# carattere da sostituire
CARATTERE='x'

# posizione carattere da sostituire
POSIZIONE=31

# per ogni riga effettuo la sostituzione
while read riga; do
echo "${riga:0:($POSIZIONE-1)}$CARATTERE${riga:$POSIZIONE:${#riga}}"
done


Ed allego un esempio del suo funzionamento.
Ho specificato nello script le variabili in gioco.


[sergio@winnie ~]$ cat testo
123456789012345678901234567890 234567890
123456789012345678901234567890 234567890
123456789012345678901234567890 234567890
123456789012345678901234567890 234567890
123456789012345678901234567890 234567890
123456789012345678901234567890 234567890
123456789012345678901234567890 234567890
123456789012345678901234567890 234567890
123456789012345678901234567890 234567890
123456789012345678901234567890 234567890

[sergio@winnie ~]$ cat testo | subst_char.sh
123456789012345678901234567890x234567890
123456789012345678901234567890x234567890
123456789012345678901234567890x234567890
123456789012345678901234567890x234567890
123456789012345678901234567890x234567890
123456789012345678901234567890x234567890
123456789012345678901234567890x234567890
123456789012345678901234567890x234567890
123456789012345678901234567890x234567890
123456789012345678901234567890x234567890

SE serve altro chiedi pure.

ciao :ciauz:

Kamui
12-01-2005, 15:00
:jam:

intanto che lo scrivevi ne ho fatto uno anch'io (dopo aver pranzato :zizi: ).

già che ci sono lo posto,

#!/bin/sh
## sostituisce il carattere alla posizione specificata di ogni riga
#+ con un carattere specificato

if [[ -z $1 || -z $2 ]]; then
echo -e "Errore\n
utilizzo: cat nomefile | script posizione_carattere carattere_di_sostituzione"
exit 3
fi

posizione_carattere=$1
carattere_di_sostituzione=$2
file_di_output="./risultato.txt"

let pos=$posizione_carattere-1
echo '' > $file_di_output
while read riga; do
car=`echo $riga | cut -c$posizione_carattere`
stringa_tmp=${riga:$pos}
testa=${riga:0:$pos}
coda=${stringa_tmp/$car/$carattere_di_sostituzione}
nuova_riga=$testa$coda
echo $nuova_riga >> $file_di_output
done

exit 0


Per sostituire tutti i dodicesimi caratteri con un trattino usa questa sintassi:


[sly@sid]~ $cat domini.txt | ./programming/sh/sostituiscicarattere.sh 12 -
[sly@sid]~ $cat domini.txt
40133 55100 nonews.org
56040 89398 frequenze.it
40478 89479 openclose.it
[sly@sid]~ $cat risultato.txt

40133 55100-nonews.org
56040 89398-frequenze.it
40478 89479-openclose.it
[sly@sid]~ $


Avrai un file risultato.txt come lo volevi tu :ciauz:

Sergio Pedone
12-01-2005, 15:03
kamui, siamo mica in competizione tra noi, no?
ben vengano altre soluzioni!

ciao! :)

Loading