[RISOLTO]Grep: cerca acquisisci dopo la linea x

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
9!Martin
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1669
Iscrizione: martedì 17 novembre 2009, 14:51
Desktop: Lxde Classico
Distribuzione: Ubuntu Trusty 32bit

[RISOLTO]Grep: cerca acquisisci dopo la linea x

Messaggio da 9!Martin »

Salve a tutti

Ho un problema e penso che Grep mi possa essere di aiuto, visto che e ricorsivo, al contrario di awk.

Devo cercare/salvare su molti file.txt, tutto quello che e compreso tra 2 linee. Sezione1 e Sezione2
Sia la prima linea che la seconda devono essere escluse esse stesse dal risultato finale.

Qualcuno ha qualche esempio?

Grazie :)

Ciao
Ultima modifica di 9!Martin il giovedì 21 aprile 2016, 15:38, modificato 1 volta in totale.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Grep: cerca acquisisci dopo la linea x

Messaggio da Zoff »

Non ti basta sed?

Codice: Seleziona tutto

sed -n '/Sezione 1/,/Sezione 2/p' nomefile
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Grep: cerca acquisisci dopo la linea x

Messaggio da UbuNuovo »

Con grep, a differenza di quel codice con sed, esclude Sezione1 e 2

Codice: Seleziona tutto

grep -Pzo "(?s)(Sezione1)\K.*?(?=Sezione2)" *.ext
Con sed (per non fare espressioni complicate) si posso eliminare dopo, con grep o sed, per esempio:

Codice: Seleziona tutto

sed -n '/Sezione1/,/Sezione2/p' *.ext | grep -Ev 'Sezione1|Sezione2'
Salva l'Ucraina! 🇺🇦
9!Martin
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1669
Iscrizione: martedì 17 novembre 2009, 14:51
Desktop: Lxde Classico
Distribuzione: Ubuntu Trusty 32bit

Re: Grep: cerca acquisisci dopo la linea x

Messaggio da 9!Martin »

Vi ringrazio, ma sed e ricorsivo?

Con: sed -n '/[SEZIONE1]/,/[SEZIONE2]/p' *.txt, compare questo errore:

Codice: Seleziona tutto

sed: -e expression #2, char 13: Invalid range end
con grep:
grep -Pzo "(?s)(Sezione1)\K.*?(?=Sezione2)" *.ext

Codice: Seleziona tutto

grep: invalid option -- P
Ciao
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Grep: cerca acquisisci dopo la linea x

Messaggio da UbuNuovo »

Porka vakka! Credo dipenda dalle versioni dei programmi, io ho GNU GPL version

Codice: Seleziona tutto

8-) sed --version
sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jay Fenlason, Tom Lord, Ken Pizzini,
and Paolo Bonzini.
Sito web di GNU sed: <http://www.gnu.org/software/sed/>.
Aiuto generico sull'uso di software GNU: <http://www.gnu.org/gethelp/>.
Segnalare eventuali bug a: <bug-sed@gnu.org>.
Assicurarsi di includere la parola ``sed'' nell'oggetto del messaggio.
8-) grep --version
grep (GNU grep) 2.16
Copyright © 2014 Free Software Foundation, Inc.
Licenza GPLv3+: GNU GPL versione 3 o successiva <http://gnu.org/licenses/gpl.html>.
Questo programma è software libero: siete liberi di modificarlo e ridistribuirlo.
Non c'è ALCUNA GARANZIA, per quanto consentito dalle vigenti normative.

Scritto da Mike Haertel e altri, consultare <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
prova con awk:

Codice: Seleziona tutto

awk "/Sezione1/,/Sezione2/" *.ext
Salva l'Ucraina! 🇺🇦
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2886
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Grep: cerca acquisisci dopo la linea x

Messaggio da rai »

Vi ringrazio, ma sed e ricorsivo?
no comunque potresti metterlo in pipe a find; per esempio così

Codice: Seleziona tutto

find LaCARTELLA -name *.txt | xargs sed '1,/SEZIONE1/d;/SEZIONE2/,$d' 
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Grep: cerca acquisisci dopo la linea x

Messaggio da UbuNuovo »

Bene Rai, ma a me funge anche con il globbing sul nome del file.

Codice: Seleziona tutto

8-) sed -n '/Sezione1/,/Sezione2/p' *.ext
Sezione1
blabla bla bla bla bla
contenuto file1
Sezione2
Sezione1
blabla bla bla bla bla
contenuto file2
Sezione2

8-) grep -Phzo "(?s)(Sezione1)\K.*?(?=Sezione2)" *.ext | grep -v '^$'
blabla bla bla bla bla
contenuto file1
blabla bla bla bla bla
contenuto file2
edit: ooops, intendevate in sottodirectory. Sorry
Salva l'Ucraina! 🇺🇦
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2886
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Grep: cerca acquisisci dopo la linea x

Messaggio da rai »

appunto io pensavo alla ricorsione che grep fa con l'opzione -R
comunque dal man si direbbe che sed debba agire su un file alla volta
Sed is a stream editor. A stream editor is used to perform basic text
transformations on an input stream (a file or input from a pipeline).
e infatti nel mio caso

Codice: Seleziona tutto

$ sed --version 
GNU sed versione 4.2.1

Codice: Seleziona tutto

$ cd /tmp/foo/
$ ls
infile2.txt  infile3.txt  infile.txt
$ sed '1,/start start/d;/stop stop/,$d' *.txt
1^riga del blocco da infile2
2^riga del blocco da infile2
$
anzi devo correggere quanto scritto prima perché usando xargs sed viene eseguito una volta sola e il risultato non sarebbe quello sperato

Codice: Seleziona tutto

$ find . -name "*.txt" | xargs sed '1,/start start/d;/stop stop/,$d'
1^riga del blocco da infile3
2^riga del blocco da infile3
$ 
bisogna usare -exec

Codice: Seleziona tutto

$ find . -name "*.txt" -exec sed '1,/start start/d;/stop stop/,$d' {} \;
1^riga del blocco da infile3
2^riga del blocco da infile3
1^riga del blocco da infile2
2^riga del blocco da infile2
1^riga del blocco da infile
2^riga del blocco da infile
$ 
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Grep: cerca acquisisci dopo la linea x

Messaggio da UbuNuovo »

Con quel codice dovrebbe andare sul sicuro.
Per quanto riguarda il globbing forse ho impostato qualche opzione particolare in bash?
Ora non ho tempo di guardare ma se non mi passa di mente poi controllo.
Salva l'Ucraina! 🇺🇦
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti