simplemente use grep "<Ctrl+V><TAB>", funciona (si es la primera vez: escriba, grep "luego presione Ctrl + V combo de teclas, luego presione la tecla TAB, luego escriba "y presione enter, voilà!)
rook
16
ctrl + v es una IDEA REALMENTE MALA! ... sí, puede funcionar desde el comando de la consola, pero NO FUNCIONA PARA TIPARLO EN UN ESCRITO (está a merced del editor, por ejemplo, uso mcedit y ctrl + v NO funciona allí)
Consejo de salvamento salva vidas! También funciona zsh, por lo que puedo decir. ¿Podría comentar cuál es la semántica de ese $signo?
Romain
2
No funciona si la cadena contiene algo más que '\ t'. ¿Cómo buscarías "\ t" (tab + espacio) por ejemplo?
Raman
66
Raman: Puedes usarlo $'\t'' '. Un ejemplo real que muestra que también funciona con sh (no solo bash, que no está instalado por defecto en Android) es busybox grep -oE '^nodev'$'\t''fuse$' /proc/filesystems.
v6ak
55
Creo que $ '...' es un idioma bash. Probablemente no funciona en sh. No sé sobre csh o tcsh.
Edward Falk
55
De 'man bash': las palabras de la forma $ 'string' se tratan especialmente. La palabra se expande a una cadena, con caracteres de escape con barra invertida reemplazados según lo especificado por el estándar ANSI C. Secuencias de escape de barra invertida, si se descodifican la actualidad, ...
broeni
84
Nunca logré hacer que el metacarácter '\ t' funcione con grep. Sin embargo, encontré dos soluciones alternativas:
Usando <Ctrl-V> <TAB>(presionando Ctrl-V y luego escribiendo pestaña)
La | awk '/\t/'solución funcionará para todos los shells, plataformas y sistemas.
Samveen
66
+1 para la solución POSIX portátil y que no utilice bashisms, zshism, GNUism y linuxisms.
Jens
1
ctrl-V no es útil si desea copiar y pegar (de sus notas o una secuencia de comandos). Un mejor uso de una solución explícita que tiene un visible '\ t', pestañas literal (es decir, los que se parecen a los espacios en blanco) a menudo se transforman a SPC cuando copypasting ...
plijnzaad
awkfunciona bien aquí, pero en algunas pruebas en mi máquina con archivos muy grandes es aproximadamente un 30% más lento que el uso grep -P. Esto puede ser trivial e irrelevante según el caso de uso, y awkpuede ser mejor simplemente por su legibilidad y portabilidad.
ctrl-V no es útil si desea copiar y pegar (de sus notas o una secuencia de comandos). Utilice mejor una solución explícita que tenga una '\ t' visible, las TAB literales (es decir, las que parecen espacios en blanco) a menudo se convierten en SPC cuando se copian las copias
plijnzaad
31
Una forma es (esto es con Bash)
grep -P '\t'
-P activa las expresiones regulares de Perl para que funcione.
Como dice el usuario desenrollar , puede ser específico de GNU grep. La alternativa es insertar literalmente una pestaña allí si el shell, el editor o la terminal lo permiten.
Como dice desenrollar, puede ser específico de GNU grep. Solo aclarado.
tjmoore 01 de
¿Cómo se agrega una pestaña? ¿No comienza el proceso de autocompletar cuando presionas el botón de tabulación? (que podría funcionar en un script bash pero no en la línea de comando)
AntonioCS
1
@AntonioCS como se señaló anteriormente por SamKrieg, para que el Shell le permita escribir cualquier carácter, simplemente escriba CTRL-v primero. Ver también askubuntu.com/questions/53071/…
Denis Arnaud
2
-P es específico de grep, no de ningún shell. -P debería funcionar en cualquier shell, siempre que GNU grep esté instalado
plijnzaad
13
Otra forma de insertar la pestaña literalmente dentro de la expresión es usar la $'\t'cita menos conocida en Bash:
grep $'foo\tbar'# matches eg. 'foo<tab>bar'
(Tenga en cuenta que si está haciendo coincidir las cadenas fijas, puede usar esto con el modo '-F').
A veces, usar variables puede hacer que la notación sea un poco más legible y manejable:
( Recomendado ) Utilice la sintaxis de expresión regular compatible con grep (1). Modern grep (1) admite dos formas de sintaxis de expresiones regulares POSIX 1003.2: RE básicas (obsoletas) y RE modernas . La sintaxis se describe en detalle en las páginas de comando man re_format (7) y regex (7) que forman parte de los sistemas BSD y Linux, respectivamente. GNU grep (1) también es compatible con REs compatibles con Perl según lo provisto por la biblioteca pcre (3).
En lenguaje regex, el símbolo de tabulación generalmente está codificado por \tátomo. El átomo está soportado por BSD extendió expresiones regulares ( egrep, grep -Een el sistema compatible BSD), así como REs compatibles con Perl ( pcregrep, GNU grep -P).
Aparentemente, tanto las expresiones regulares básicas como los RE extendidos de Linux no tienen soporte para \t. Consulte la página de manual de la utilidad UNIX para saber qué lenguaje de expresiones regulares admite (de ahí la diferencia entre las expresiones regulares sed (1), awk (1) y pcregrep (1)).
Por lo tanto, en Linux:
$ grep -P '\t' FILE ...
En el sistema BSD por igual:
$ egrep '\t' FILE ...
$ grep -E '\t' FILE ...
Pase el carácter de tabulación al patrón. Esto es sencillo cuando edita un archivo de script:
# no tabs for Python please!
grep -q ' ' *.py && exit 1
Sin embargo, cuando trabaje en un shell interactivo, es posible que deba confiar en las capacidades de shell y terminal para escribir el símbolo adecuado en la línea. En la mayoría de los terminales, esto se puede hacer a través de la combinación de teclas Ctrl+ Vque le indica al terminal que trate el siguiente carácter de entrada literalmente ( Ves para "textualmente"):
$ grep '<Ctrl>+<V><TAB>' FILE ...
Algunos shells pueden ofrecer soporte avanzado para la composición tipográfica de comandos. Tal, en bash (1) las palabras del formulario $'string'se tratan especialmente:
bash$ grep $'\t' FILE ...
Sin embargo, tenga en cuenta que, si bien es agradable en una línea de comandos, esto puede producir problemas de compatibilidad cuando el script se moverá a otra plataforma. Además, tenga cuidado con las citas cuando use las ofertas especiales, consulte bash (1) para obtener más detalles.
Para el shell Bourne (y no solo) se puede emular el mismo comportamiento utilizando la sustitución de comandos aumentada por printf (1) para construir la expresión regular adecuada:
Usar el método 'sed-as-grep', pero reemplazar las pestañas con un carácter visible de preferencia personal es mi método favorito, ya que muestra claramente qué archivos contienen la información solicitada y también dónde se coloca dentro de las líneas:
sed -n 's/\t/\*\*\*\*/g' file_name
Si desea hacer uso de la información de línea / archivo u otras opciones grep, pero también quiere ver el reemplazo visible para el carácter de tabulación, puede lograr esto al
grep -[options] -P '\t' file_name | sed 's/\t/\*\*\*\*/g'
Como ejemplo:
$ echo "A\tB\nfoo\tbar" > test
$ grep -inH -P '\t' test | sed 's/\t/\*\*\*\*/g'
test:1:A****B
test:2:foo****bar
EDITAR: Obviamente, lo anterior solo es útil para ver el contenido del archivo para localizar pestañas --- si el objetivo es manejar pestañas como parte de una sesión de secuencia de comandos más grande, esto no sirve para ningún propósito útil.
Estos métodos alternativos de identificación binaria son totalmente funcionales. Y, realmente me gusta que alguien esté usando awk, ya que no podía recordar el uso sintáctico con caracteres binarios individuales. Sin embargo, también debería ser posible asignar un valor a una variable de shell de una manera portátil POSIX (es decir, TAB = echo "@" | tr "\100" "\011"), y luego emplearlo desde allí en todas partes, de manera portátil POSIX; también (es decir, nombre de archivo grep "$ TAB"). Si bien esta solución funciona bien con TAB, también funcionará bien con otros caracteres binarios, cuando se utiliza otro valor binario deseado en la asignación (en lugar del valor para el carácter TAB a 'tr').
para buscar el carácter de tabulación en el archivo foo. Probablemente también pueda hacer otros códigos de escape, aunque solo he probado \ n. Aunque es bastante lento y no está claro por qué querría hacerlo, en zsh también puede escribir el carácter de tabulación, volver al principio, grep y encerrar la tabulación con comillas.
grep "<Ctrl+V><TAB>"
, funciona (si es la primera vez: escriba,grep "
luego presione Ctrl + V combo de teclas, luego presione la tecla TAB, luego escriba"
y presione enter, voilà!)Respuestas:
Si usa GNU grep, puede usar la expresión regular estilo Perl:
fuente
-P
opción.El truco es usar el signo $ antes de las comillas simples . También funciona para cortar y otras herramientas.
fuente
zsh
, por lo que puedo decir. ¿Podría comentar cuál es la semántica de ese$
signo?$'\t'' '
. Un ejemplo real que muestra que también funciona con sh (no solo bash, que no está instalado por defecto en Android) esbusybox grep -oE '^nodev'$'\t''fuse$' /proc/filesystems
.Nunca logré hacer que el metacarácter '\ t' funcione con grep. Sin embargo, encontré dos soluciones alternativas:
<Ctrl-V> <TAB>
(presionando Ctrl-V y luego escribiendo pestaña)foo | awk '/\t/'
fuente
| awk '/\t/'
solución funcionará para todos los shells, plataformas y sistemas.awk
funciona bien aquí, pero en algunas pruebas en mi máquina con archivos muy grandes es aproximadamente un 30% más lento que el usogrep -P
. Esto puede ser trivial e irrelevante según el caso de uso, yawk
puede ser mejor simplemente por su legibilidad y portabilidad.De esta respuesta en Ask Ubuntu:
fuente
Una forma es (esto es con Bash)
-P
activa las expresiones regulares de Perl para que funcione.Como dice el usuario desenrollar , puede ser específico de GNU grep. La alternativa es insertar literalmente una pestaña allí si el shell, el editor o la terminal lo permiten.
fuente
Otra forma de insertar la pestaña literalmente dentro de la expresión es usar la
$'\t'
cita menos conocida en Bash:(Tenga en cuenta que si está haciendo coincidir las cadenas fijas, puede usar esto con el modo '-F').
A veces, usar variables puede hacer que la notación sea un poco más legible y manejable:
fuente
Esto no es exactamente lo que está buscando, pero podría funcionar en su caso
Equivalente a
Entonces encontrará Space y Tab.
§ Clases de personajes
Tenga en cuenta que no se anuncia en mi
man grep
, pero aún funcionafuente
-P
se agregó el argumento.Use echo para insertar la pestaña por usted
grep "$(echo -e \\t)"
fuente
Básicamente hay dos formas de abordarlo:
( Recomendado ) Utilice la sintaxis de expresión regular compatible con grep (1). Modern grep (1) admite dos formas de sintaxis de expresiones regulares POSIX 1003.2: RE básicas (obsoletas) y RE modernas . La sintaxis se describe en detalle en las páginas de comando man re_format (7) y regex (7) que forman parte de los sistemas BSD y Linux, respectivamente. GNU grep (1) también es compatible con REs compatibles con Perl según lo provisto por la biblioteca pcre (3).
En lenguaje regex, el símbolo de tabulación generalmente está codificado por
\t
átomo. El átomo está soportado por BSD extendió expresiones regulares (egrep
,grep -E
en el sistema compatible BSD), así como REs compatibles con Perl (pcregrep
, GNUgrep -P
).Aparentemente, tanto las expresiones regulares básicas como los RE extendidos de Linux no tienen soporte para
\t
. Consulte la página de manual de la utilidad UNIX para saber qué lenguaje de expresiones regulares admite (de ahí la diferencia entre las expresiones regulares sed (1), awk (1) y pcregrep (1)).Por lo tanto, en Linux:
En el sistema BSD por igual:
Pase el carácter de tabulación al patrón. Esto es sencillo cuando edita un archivo de script:
Sin embargo, cuando trabaje en un shell interactivo, es posible que deba confiar en las capacidades de shell y terminal para escribir el símbolo adecuado en la línea. En la mayoría de los terminales, esto se puede hacer a través de la combinación de teclas
Ctrl
+V
que le indica al terminal que trate el siguiente carácter de entrada literalmente (V
es para "textualmente"):Algunos shells pueden ofrecer soporte avanzado para la composición tipográfica de comandos. Tal, en bash (1) las palabras del formulario
$'string'
se tratan especialmente:Sin embargo, tenga en cuenta que, si bien es agradable en una línea de comandos, esto puede producir problemas de compatibilidad cuando el script se moverá a otra plataforma. Además, tenga cuidado con las citas cuando use las ofertas especiales, consulte bash (1) para obtener más detalles.
Para el shell Bourne (y no solo) se puede emular el mismo comportamiento utilizando la sustitución de comandos aumentada por printf (1) para construir la expresión regular adecuada:
fuente
grep "$(printf '\t')"
funcionó para mí en Mac OS Xfuente
use gawk, establezca el delimitador de campo en tab (\ t) y verifique el número de campos. Si hay más de 1, entonces hay pestañas
fuente
awk /\t/
es suficiente para la pregunta del operador.Una buena opción es usar 'sed as grep' (como se explica en este tutorial clásico de sed ).
Ejemplos (funciona en bash, sh, ksh, csh, ..):
fuente
+1 forma, que funciona en ksh, dash, etc.: use printf para insertar TAB:
fuente
grep "$(printf '\t')" testfile.txt
La respuesta es más simple. Escriba su grep y dentro de la cita escriba la tecla de tabulación, funciona bien al menos en ksh
fuente
En ksh solía
fuente
Usar el método 'sed-as-grep', pero reemplazar las pestañas con un carácter visible de preferencia personal es mi método favorito, ya que muestra claramente qué archivos contienen la información solicitada y también dónde se coloca dentro de las líneas:
Si desea hacer uso de la información de línea / archivo u otras opciones grep, pero también quiere ver el reemplazo visible para el carácter de tabulación, puede lograr esto al
Como ejemplo:
EDITAR: Obviamente, lo anterior solo es útil para ver el contenido del archivo para localizar pestañas --- si el objetivo es manejar pestañas como parte de una sesión de secuencia de comandos más grande, esto no sirve para ningún propósito útil.
fuente
Esto funciona bien para AIX. Estoy buscando líneas que contengan
JOINED<\t>ACTIVE
fuente
Es posible que desee utilizar
grep "$(echo -e '\t')"
El único requisito es
echo
ser capaz de interpretar escapes de barra invertida.fuente
Estos métodos alternativos de identificación binaria son totalmente funcionales. Y, realmente me gusta que alguien esté usando awk, ya que no podía recordar el uso sintáctico con caracteres binarios individuales. Sin embargo, también debería ser posible asignar un valor a una variable de shell de una manera portátil POSIX (es decir, TAB =
echo "@" | tr "\100" "\011"
), y luego emplearlo desde allí en todas partes, de manera portátil POSIX; también (es decir, nombre de archivo grep "$ TAB"). Si bien esta solución funciona bien con TAB, también funcionará bien con otros caracteres binarios, cuando se utiliza otro valor binario deseado en la asignación (en lugar del valor para el carácter TAB a 'tr').fuente
La notación $ '\ t' dada en otras respuestas es específica de shell: parece funcionar en bash y zsh pero no es universal.
NOTA: Lo siguiente es para el
fish
shell y no funciona en bash :En el
fish
shell, se puede usar un sin comillas\t
, por ejemplo:O uno puede usar las notaciones hexadecimales o unicode, por ejemplo:
(estas anotaciones son útiles para más caracteres esotéricos)
Dado que estos valores deben estar sin comillas, se pueden combinar valores con comillas y sin comillas por concatenación:
fuente
Puedes escribir
o
para buscar el carácter de tabulación en el archivo foo. Probablemente también pueda hacer otros códigos de escape, aunque solo he probado \ n. Aunque es bastante lento y no está claro por qué querría hacerlo, en zsh también puede escribir el carácter de tabulación, volver al principio, grep y encerrar la tabulación con comillas.
fuente
Busque espacios en blanco muchas veces [[: espacio:]] *
grep [[: espacio:]] * '.' '.'
Encontrará algo como esto:
'la tabla' ..
Estas son comillas simples ('), y no dobles (").
Así es como se hace la concatenación en grep. = -)
fuente