¿Cómo grep para pestañas sin usar pestañas literales y por qué no funciona?

116

Cuando busco pestañas en un archivo con (e) grep, utilizo la pestaña literal ( ^v + <tab> ). No puedo utilizar \t como reemplazo de pestañas en expresiones regulares. Por ej. sed esta expresión funciona muy bien.

¿Existe alguna posibilidad de usar un reemplazo no literal para <tab> y cuáles son los fondos para un \t ?

no funcional / no interpretado?     
pregunta Lasall 14.07.2011 - 13:59

4 respuestas

163

grep usa expresiones regulares tal como se define en POSIX . Por las razones que sean, POSIX no ha definido \t como pestaña.

Tiene varias alternativas:

  • indica a grep que use las expresiones regulares definidas por perl (perl tiene \t como pestaña):

    grep -P "\t" foo.txt
    

    la página del manual advierte que esta es una característica "experimental". al menos \t parece funcionar bien. pero las características más avanzadas de perl regex pueden no.

  • use printf para imprimir un carácter de pestaña para usted:

    grep "$(printf '\t')" foo.txt
    
  • utiliza el carácter de tabulación literal:

    grep "^V<tab>" foo.txt
    

    esto es: escriba grep " , luego presione ctrl+v , luego presione tab , luego escriba " foo.txt . presionar ctrl+v en el terminal hace que la siguiente tecla se tome textualmente. eso significa que el terminal insertará un carácter de tabulación en lugar de activar alguna función vinculada a la tecla de tabulación.

  • utiliza la función ansi c quoting de bash:

    grep $'\t' foo.txt
    

    esto no funciona en todas las conchas.

  • usa awk:

    awk '/\t/'
    
  • use sed:

    sed -n '/\t/p'
    

Consulte el artículo de wikipedia sobre expresiones regulares para obtener una descripción general de las clases de caracteres definidas en POSIX y otros sistemas.

    
respondido por el lesmana 14.07.2011 - 17:04
12

No es exactamente la respuesta que desearía escuchar, pero un posible uso de secuencias de escape es proporcionado por bash

command | grep $'\t'

(¡no lo ponga entre comillas!).

    
respondido por el enzotib 14.07.2011 - 16:15
2

awk '/\t/' es mi solución alternativa preferida:

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

Salida: a\t .

    
1

Siempre se puede recurrir al uso del código hexadecimal ascii para la pestaña:

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

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

$ grep $'\x9' input.txt                                            
one two
    
respondido por el Sergiy Kolodyazhnyy 03.07.2017 - 19:04

Lea otras preguntas en las etiquetas