Come fare grep per le schede senza usare tab letterali e perché non funziona?

119

Quando cerco schede in un file con (e) grep, utilizzo la scheda litteral ( ^v + <tab> ). Non riesco a utilizzare \t come sostituto delle schede nelle espressioni regolari. Ad es. questa espressione funziona molto bene.

Quindi esiste la possibilità di utilizzare una sostituzione non letterale per <tab> e quali sono gli sfondi per un% non funzionante / non interpretato% co_de?

    
posta Lasall 14.07.2011 - 13:59

4 risposte

169

grep utilizza espressioni regolari come definito da POSIX . Per qualsiasi motivo, POSIX non ha definito \t come scheda.

Hai diverse alternative:

  • dire a grep di usare le espressioni regolari come definite da perl (perl ha \t come scheda):

    grep -P "\t" foo.txt
    

    la pagina man avverte che si tratta di una funzionalità "sperimentale". almeno \t sembra funzionare correttamente. ma le funzioni regex più avanzate di perl potrebbero non farlo.

  • usa printf per stampare un carattere di tabulazione per te:

    grep "$(printf '\t')" foo.txt
    
  • usa il carattere di tabulazione letterale:

    grep "^V<tab>" foo.txt
    

    cioè: digita grep " , quindi premi ctrl+v , quindi premi tab , quindi digita " foo.txt . premendo ctrl+v nel terminale si fa in modo che la prossima chiave venga eseguita alla lettera. ciò significa che il terminale inserirà un carattere di tabulazione invece di attivare alcune funzioni associate al tasto tab.

  • utilizza la citazione ansi c della funzione bash:

    grep $'\t' foo.txt
    

    questo non funziona in tutte le shell.

  • usa awk:

    awk '/\t/'
    
  • usa sed:

    sed -n '/\t/p'
    

Vedi l'articolo wikipedia sulle espressioni regolari per una panoramica delle classi di caratteri definite in POSIX e in altri sistemi.

    
risposta data lesmana 14.07.2011 - 17:04
12

Non è esattamente la risposta che vorresti sentire, ma un possibile uso delle sequenze di escape è fornito da bash

command | grep $'\t'

(non metterlo tra virgolette!).

    
risposta data enzotib 14.07.2011 - 16:15
2

awk '/\t/' è la mia soluzione alternativa preferita:

printf 'a\t\nb' | awk '/\t/'

Output: a\t .

    
1

Si può sempre ricorrere all'utilizzo del codice esadecimale ascii per la scheda:

$ echo "one"$'\t'"two" > input.txt                                 

$ grep -P "\x9" input.txt                                          
one two

$ grep $'\x9' input.txt                                            
one two
    
risposta data Sergiy Kolodyazhnyy 03.07.2017 - 19:04

Leggi altre domande sui tag