Vai al contenuto

cercare pattern all'interno di un file via shell


les2

Messaggi raccomandati

Ciao,

ho la necessità di lanciare un comando che mi permetta di cercare un pattern all'interno di un file (e che risponda positivo o negativo),

per fare le sostituzioni uso perl in questo modo:

perl -pi -e 's|find|replace|sg' *.txt

o un comando simile (non necessariamente perl ma che sia un comando singolo) che mi permetta di matchare un pattern all'interno di un file?

grazie a tutti in anticipo :)

Link al commento
Condividi su altri siti

non so se ho formulato male la richiesta o invece la stessa non è così semplice come speravo...

nel frattempo mi sono accontentato di fare l'operazione con objective-c (decisamente più macchinoso però :( )

puoi farlo con sed:

cat -A file_originale.txt | sed -e 's/PTRN_DA_CERCARE/SOSTITUZIONE/g'>>file_modificato.txtrm file_originale.txt; mv file_modificato.txt file_originale.txt

Link al commento
Condividi su altri siti

intanto grazie mille :)

domanda:

così però non faccio anche una sostituzione con il comando mv?

nello specifico del mio caso alla fine ho fatto una piccola app in objective-c che fa l'operazione,

mi chiedevo però se appunto non esistesse un comando bash;)

Link al commento
Condividi su altri siti

intanto grazie mille :)

domanda:

così però non faccio anche una sostituzione con il comando mv?

nello specifico del mio caso alla fine ho fatto una piccola app in objective-c che fa l'operazione,

mi chiedevo però se appunto non esistesse un comando bash;)

Certo, fa una sostituzione, ma sostituisce il nuovo contenuto al vecchio, ti spiego meglio il comando che ti ho suggerito:

cat -A file_originale.txt | sed -e 's/PTRN_DA_CERCARE/SOSTITUZIONE/g'>>file_modificato.txt;rm file_originale.txt; mv file_modificato.txt file_originale.txt

cat -A file_originale.txt

questo comando legge il file originale

cat -A file_originale.txt | sed

il pipe "|" fra il comando cat e il comando sed significa che sed lavorerà sui dati ricevuti da cat

sed -e 's/PTRN_DA_CERCARE/SOSTITUZIONE/g'>>file_modificato.txt

come abbiamo detto, sed lavorerà sui dati ricevuti da cat, e non su un file fisico (sed = stream editor), quindi avrà bisogno di scrivere questi dati da qualche parte, in questo caso il scrive in "file_modificato.txt"

A questo punto abbiamo due files, quello originale e quello modificato.

rm file_originale.txt; mv file_modificato.txt file_originale.txt

Questa sequenza cancella il file originale e rinomina il file modificato con il nome del file originale, così da ottenere la situazione "iniziale"

Dubbi?

NB: nel mio messaggio precedente mi sono scordato di mettere il punto e virgola fra ">>file_modificato.txt" e "rm file_originale.txt"!! :oops:

Link al commento
Condividi su altri siti

grazie ancora per la disponibilità,

mi era chiaro il il comando, però in realtà a me serve solo un return true/false se il pattern è contenuto nel file o meno.

togliere le righe "bianche" e crarne un doppione mi sembra di contorno,

il dubbio in realtà è:

anche avendo "pattern da cercare" e "cercato" identici, mi da una risposta positiva o negativa?

non mi pare (ma in questo momento non lo sto testando) :)

Link al commento
Condividi su altri siti

ah ok... non avevo capito bene io allora

beh a questo punto puoi usare

grep -c "PATTERN" file.txt

anche se questo restituisce il numero di occorrenze del pattern, e restituisce 0 se non trova niente (al massimo puoi inserirlo all'interno di uno script che a sua volta restituisce true se il risultato è diverso da 0 e false nel caso contrario)

Link al commento
Condividi su altri siti

grandissimo, proprio questo cercavo!!! :)

(in effetti mi sembrava assurdo che non ci fosse)

e io pollo però :D perchè la funzione grep la uso anche spesso per avere dei risultati leggibili, ma non sapevo leggesse il contenuto di un file!

diciamo che non sono il più forte a riga di comando :D

grazie ancora!!!

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...