Risposta sicura per la distribuzione incrociata (incluso Windows minGW?)
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
Se stai usando versioni precedenti di grep (come 2.4.2) che non include l'opzione -o. Usa quanto sopra. Altrimenti usa il più semplice per mantenere la versione di seguito.
Risposta sicura di Linux cross-distribution
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
In sintesi, -oh
l'espressione regolare corrisponde al contenuto del file (e non al suo nome file), proprio come ti aspetteresti che l'espressione regolare funzioni in vim / etc ... Quale parola o espressione regolare dovresti cercare, dipende da voi! Finché rimani in POSIX e non nella sintassi perl (vedi sotto)
Altro dal manuale di grep
-o Print each match, but only the match, not the entire line.
-h Never print filename headers (i.e. filenames) with output lines.
-w The expression is searched for as a word (as if surrounded by
`[[:<:]]' and `[[:>:]]';
Il motivo per cui la risposta originale non funziona per tutti
L'uso di \w
varia da piattaforma a piattaforma, in quanto è una sintassi estesa "perl". Come tale, quell'installazione grep che è limitata a funzionare con le classi di caratteri POSIX usa [[:alpha:]]
e non il suo equivalente perl di \w
. Vedi la pagina di Wikipedia sull'espressione regolare per ulteriori informazioni
Alla fine, la risposta POSIX sopra sarà molto più affidabile indipendentemente dalla piattaforma (essendo l'originale) per grep
Per quanto riguarda il supporto di grep senza l'opzione -o, il primo grep produce le linee pertinenti, il tr suddivide gli spazi in nuove linee, i filtri grep finali solo per le rispettive linee.
(PS: ormai conosco la maggior parte delle piattaforme, sarebbe stata patchata per \ w .... ma ci sono sempre quelle che rimangono indietro)
Ringraziamo la soluzione "-o" dalla risposta di @AdamRosenfield