Ricerca con grep, caso con più stringhe sulla stessa linea – 2

Quando ho scritto su grep e la ricerca di più parole o frasi sulla stessa riga ho scritto due cose questionabili; sono stato corretto subito e anche se non sono invidioso non ringrazio il correttore 😡 Non è vero, pesce di metà gennaio 😁 grazie 😁 al giovane collaboratore 💥 PLG 💥 che non blogga e non twitta 😁

La soluzione per lo script bash è quella che ho chiamato “perlosa”, -P, in locale con man grep o qui

-P, –perl-regexp
Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn of unimplemented features.

Vale per quante siano le espressioni, da una all’infinito (anche se, obiettivamente, dai!).

Ecco lo script, non c’è bisogno di commenti vero? CMQ c’è un accumulatore, PCMD che viene costriuto con gli argomenti, l’ultimo escluso; questo viene poi assemblato con la testa PC e la coda PD che termina con l’ultimo argomento passato.

Per vedere come funziona viene visualizzato –per ora– il comando da passare a eval.

#!/bin/bash

PCMD=""

while [[ $# -gt 1 ]] ; do
  PCMD=$PCMD'(?=.*'$1')'
  shift
done

PC="grep -P '"
PD="' "$1

echo kwindy $PC$PCMD$PD
eval $PC$PCMD$PD

Usando il file gtest ottengo:

gtest

3 4 5
1 4 5 6 2 3
a b c d
1 4 5 6 2 3
2 3 4
6 5 4 2 1 3
xxx
qui non ci sono 1 2 3
qui sì 123654

OK, vista la differenza tra le due richieste?

Ma questa versione ha un grosso bug che lo rende inutilizzabile. Lo so che l’avete già visto ma lo dico lo stesso: interpreta l’ultimo argomento come il nome del file da cercare e solo quello. Quindi non posso dirgli di cercare in più files, eventualmente con l’uso di jollies (? e *).

La modifica richiesta è semplice, introdurre negli argomenti uno di separazione; potrebbe essere -f ma se si volesse cercare proprio quell’espressione? Il più semplice che non dovrebbe generare ambiguità che ho scelto è ^^^.

Lo script diventa quindi:

#!/bin/bash

PCMD=""
while [[ $1 != '^^^' ]] ; do
  PCMD=$PCMD'(?=.*'$1')'
  shift
done

shift # toglie ^^^
PC="grep -P '"
PD="' "$@
eval $PC$PCMD$PD

Posso testarlo per gli scripts in ~/bin che usano awk:

Il carattere # deve essere escapato altrimenti la shell lo interpreta come inizio di commento.

Come verifica posso usare shbp, descritto qui.

Sì, shbp si poteva costruire più semplicemente usando g+. In realtà l’dea di usare grep mi  ci è venuta durante lo sviluppo di shb e shbp 😉

Nota: sì, manca la gestione degli errori; lasciato come esercizio. E nuovamente h/t a PLG 💥

🤩

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: