Discussione:
Bash. riportare puntatore alla riga precendete
(troppo vecchio per rispondere)
News@tin.it
2021-09-15 11:14:21 UTC
Permalink
Stavo provando a fare uno script bash un pò particolare
per il fatto che lo script deve leggere File1 riga per riga
quando trova un pattern deve entrare in un altro ciclo
if read File1 fi, per leggere la prossima riga e se trova
un secondo pattern fare qualche cosa, ma anche se non
trova nulla esce da ciclo if e si deve riportare il "puntatore"
del File1 alla riga precedente prima del ciclo principale
while read che sta a monte.

Mi sapete dire se sia possibile fare una cosa del genere con
il linguaggio bash?

Grazie a tutti

Ciao
Mario M. Macaluso
2021-09-15 18:15:22 UTC
Permalink
Post by ***@tin.it
Stavo provando a fare uno script bash un pò particolare
[o si lascia o si cancella tutto. cancello ]

Mi sembra tanto il classico problema da compito in classe,
ma una mano si può sempre dare.

Proverò a fare qualcosa che forse nessuno ha mai fatto:

un flow chart in forma testuale piuttosto che grafica.
(presumo che ci sarà una discussione sulla mia presunzione e sulla riuscita)

Cosa ti serve sapere:

comandi: sed (e qui si discuterà sicuramente su tutte le alternative)
programmazione bash: come manipolare le stringhe (vedi sotto)

Iniziamo:

1 - Come sapere quante righe ci sono nel file

sed -n '$=' <nome file>

2 - l'output di sed va salvato in una variabile apposita

3 - inizializzi il contatore di riga

4 - confronti il contatore di riga con la variabile del punto 2
finchè il suo valore non è superiore puoi elaborae il file,
altrimenti hai finito

5 - leggi una riga dal file

sed -n ${<contatore>}p <nome file>

6 - l'output di sed va salvato in una variabile apposita

adesso viene il bello
devi sapere come bash permette di manipolare le stringhe
(cercare, eliminare, contare ecc ecc)

su google: "bash string manupulation"

se maiuscole e minuscole non sono un problema il consiglio è di convertire
la riga letta in tutte maiuscole/minuscole a tua scelta

7 - la riga letta contiene quello che stai cercando

7a - copi il valore del contatore di righe in un'altra variabile

7b - incrementi il valore del secondo contatore

7c - leggi la riga successiva utilizzando il secondo contatore

7d - la riga letta contiene quello che stai cercando

7d1 - <fai quello che devi>

7d2 - continui dal punto 7b

8 - incrementi il contatore di riga

9 - continui dal punto 4
Yoda
2021-09-15 20:23:16 UTC
Permalink
Addi' 15 set 2021 18:15:22, Mario M. Macaluso scrive:

-snip-
Post by Mario M. Macaluso
se maiuscole e minuscole non sono un problema il consiglio è di convertire
la riga letta in tutte maiuscole/minuscole a tua scelta
Perche'?
--
bye, Yoda
Archaeopteryx
2021-09-15 20:28:34 UTC
Permalink
Post by Yoda
Perche'?
Suppongo che il motivo sia che Linux è case sensitive e a
ogni "if" bisogna controllare il doppio delle cose.

Programmando faccio così pure io; tengo una copia
dell'originale e tutte le varie manipolazioni le faccio
dopo una bella passata di strlwr(qualcosa). Se serve,
riprendo l'originale e metto in atto i cambiamenti del caso.

Se invece il problema non è case sensitive come non detto :D
--
Ho fatto sesso con Control. Domani
provo Alt+Del.
rootkit
2021-09-15 20:44:30 UTC
Permalink
Stavo provando a fare uno script bash un pò particolare per il fatto che
lo script deve leggere File1 riga per riga quando trova un pattern deve
entrare in un altro ciclo if read File1 fi, per leggere la prossima
riga e se trova un secondo pattern fare qualche cosa, ma anche se non
trova nulla esce da ciclo if e si deve riportare il "puntatore"
del File1 alla riga precedente prima del ciclo principale while read
che sta a monte.
e che senso ha?
leggi la riga x: esegui una subroutine che ti ributta alla riga x-1: al
giro dopo torni alla riga x: non è cambiato nulla, quindi la subroutine
ti ributterà alla riga x-1.
non ne esci più.
News@tin.it
2021-09-16 07:18:23 UTC
Permalink
Post by rootkit
Stavo provando a fare uno script bash un pò particolare per il fatto che
lo script deve leggere File1 riga per riga quando trova un pattern deve
entrare in un altro ciclo if read File1 fi, per leggere la prossima
riga e se trova un secondo pattern fare qualche cosa, ma anche se non
trova nulla esce da ciclo if e si deve riportare il "puntatore"
del File1 alla riga precedente prima del ciclo principale while read
che sta a monte.
e che senso ha?
leggi la riga x: esegui una subroutine che ti ributta alla riga x-1: al
giro dopo torni alla riga x: non è cambiato nulla, quindi la subroutine
ti ributterà alla riga x-1.
non ne esci più.
no, perche quando torno faccio una lettura della riga che mi porta
alla riga sucessiva che era quella elaborata poco prima nel secondo
ciclo if.

Loading...