Abilita grep a corrispondere esattamente all'espressione regolare

3

Abilita il comando 'grep', restituisce esattamente l'espressione regolare corrispondente.

Il comando grep stamperà una riga quando la riga contiene una stringa che corrisponde a un'espressione, il che non è utile per cercare il contenuto specificato. Ad esempio, ho file di vocabolario con formattazione

    **word**
    1. Definition:
    2. Usage
    3. Others

Vorrei recuperare tutte le parole per creare una lista di parole all'interno dei file

    grep '\*\*[^*]*\*\*'

Restituisce enormi quantità di contenuti.

Come abilitare grep a catturare solo la 'parola'?

    
posta JawSaw 26.03.2018 - 17:43
fonte

2 risposte

3

Utilizza awk .

Questo comando "estrae" un grosso elenco di parole assumendo che sia nel formato che hai specificato sopra:

awk '/\*\*/,/\*\*/ {print substr($0, 3, length($0)-4)}' <filename>

Esempio:

Per questo esempio, supponiamo di avere un file di testo chiamato words.txt con il seguente contenuto:

**test**
1. Definition:
2. Usage
3. Others

**foo**
1. Definition:
2. Usage
3. Others

**bar**
1. Definition:
2. Usage
3. Others


$ awk '/\*\*/,/\*\*/ {print substr($0, 3, length($0)-4)}' words.txt

test
foo
bar

Cosa sta facendo

  • /\*\*/,/\*\*/ Questa è la gamma di modelli . Avrei potuto farlo cercando il primo set di asterischi ( /\*\* ) ed è stato fatto, ma ho usato un intervallo completo per la completezza. Un metodo non è più "giusto" rispetto all'altro.

  • {print substr($0, 3, length($0)-4)}' Stampa la sottotensione (della stringa **word** ) iniziando dal terzo carattere, con una lunghezza dell'intera stringa ( length($0) ) meno quattro caratteri (i quattro asterischi).

  • <filename> Questo è il file di input per elaborare il comando awk

risposta data 26.03.2018 - 21:54
fonte
0

Ecco l'output che ho ottenuto usando un file di esempio con i contenuti presi in prestito da Allan, insieme al tuo comando grep :

All'iniziopensavochenoncifosseroproblemi,poichésembracherestituiscalerighechecontengonolaparola,ehoassuntochetuvolessimantenereil**,datoquantoesplicitamentesembraesserenellastringaregexp.

Ma,dopoaverlettolatuadomandaconpiùattenzione,orastovedendochenonvuoiil**,evogliosololaparola(s)contenutaall'internodi**.

Perfareciò,puoiancorautilizzareiltuostessocomandogrep,quindicollegarloatrperfareinmodocheelimini**:

grep'\*\*[^*]*\*\*'/path/to/file|tr-d'*'

    
risposta data 29.03.2018 - 23:20
fonte

Leggi altre domande sui tag