Cuando busco pestañas en un archivo con (e) grep, uso la pestaña literal ( ^v + <tab>
). No puedo utilizar \t
como reemplazo de pestañas en expresiones regulares. Con, por ejemplo, sed, esta expresión funciona muy bien.
Entonces, ¿hay alguna posibilidad de usar un reemplazo no literal <tab>
y cuáles son los antecedentes de un trabajo / no interpretado \t
?
bash
grep
regex
posix-compliant
Lasall
fuente
fuente
Respuestas:
grep está utilizando expresiones regulares según lo definido por POSIX . Por alguna razón POSIX no se ha definido
\t
como pestaña.Tienes varias alternativas:
dile a grep que use las expresiones regulares definidas por perl (perl tiene
\t
como tabulador):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 seruse printf para imprimir un carácter de tabulación para usted:
usa el carácter de tabulación literal:
es decir: escriba
grep "
, luego presionectrl+v
, luego presionetab
, luego escriba" foo.txt
. Al presionarctrl+v
el terminal, la siguiente tecla se tomará al pie de la letra. 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.use la función de cita ansi c de bash:
Esto no funciona en todos los depósitos.
usa awk:
usar sed:
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.
fuente
grep $'\t' foo.txt
(pero normalmente escribiría enfgrep
lugar degrep
)grep "$(printf '\t')${myvar}" foo.txt
. Funcionó bien. Con algunos intentos, no pude conseguir que funcionara la última forma.grep
no pueda interpretarse silenciosamente\t
como tab? ¿POSIX requiere que eso\t
signifique algo más? ¿Quizás se supone que debe coincidir solo con un literal\
seguido de unt
?This is highly experimental and grep -P may warn of unimplemented features.
Probablemente no sea una buena idea para usar-P
en sistemas heredados. Laprintf
elección es mejorBash no es exactamente la respuesta que le gustaría escuchar, pero bash proporciona un posible uso de secuencias de escape
(¡no lo ponga entre comillas dobles!).
fuente
grep $'\t'
.awk '/\t/'
es mi solución favorita:Salida:
a\t
.fuente
Siempre se puede recurrir al uso del código hexadecimal ascii para la pestaña:
fuente