grep "^$1"
funciona, pero ¿cómo escapo "$1"
para que grep no interprete ningún personaje en él especialmente?
¿O hay un mejor camino?
Editar:
no quiero buscar '^$1'
sino una cadena fija insertada dinámicamente que solo debe coincidir si está al comienzo de una línea. Eso es lo que quise decir con el $1
.
grep '^$1'
? ¿O no quiso decir que desea evitar$1
que el shell lo expanda?grep
pero primero tendrá que escapar de cualquier carácter especial en su cadena, por ejemploprintf %s ^;printf %s "$1" | sed 's/[][\.*^$]/\\&/g'; } | grep -f- infile
Respuestas:
No puedo pensar en una forma de hacer esto usando
grep
;^
en sí mismo es parte de una expresión regular, por lo que su uso requiere la interpretación de expresiones regulares. Es trivial usar la coincidencia de subcadenasawk
,perl
o lo que sea:Para manejar las cadenas de búsqueda que contienen
\
, puede usar el mismo truco que en la respuesta de 123 :fuente
\/
\\\/\/\/\\\\/
que se ven\\///\\/
en el programa. Hasta donde sé, no hay forma de escapar de las barras invertidas en awk, a menos que sepa cuántos se usarán de antemano.Si solo necesita verificar si se encuentra o no una coincidencia, corte todas las líneas de entrada a la longitud del prefijo deseado (
$1
) y luego use grep de patrón fijo:También es fácil obtener el recuento de líneas coincidentes:
O los números de línea de todas las líneas coincidentes (los números de línea comienzan en 1):
Puede alimentar los números de línea
head
ytail
obtener el texto completo de las líneas coincidentes, pero en ese punto es más fácil acceder a un lenguaje de script moderno como Python o Ruby.(Los ejemplos anteriores suponen que Posix grep and cut. Asumen que el archivo a buscar proviene de una entrada estándar, pero puede adaptarse fácilmente para tomar un nombre de archivo).
Editar: también debe asegurarse de que el patrón (
$1
) no sea una cadena de longitud cero. De lo contrariocut
no se puede decirvalues may not include zero
. Además, si usa Bash, useset -o pipefail
para atrapar salidas de error porcut
.fuente
Una forma de usar perl que respetará las barras invertidas
Esto establece la variable de entorno v para el comando, luego imprime si el índice de la variable es 0, es decir, el comienzo de la línea.
También puedes hacer lo mismo en awk
fuente
Aquí hay una opción de todo bash, no es que recomiende bash para el procesamiento de texto, pero funciona.
El script calcula la longitud
len
del parámetro ingresado $ 1, luego usa la expansión de parámetros en cada línea para ver si los primeroslen
caracteres coinciden con $ 1. Si es así, imprime la línea.fuente
Si su
$1
es ASCII puro ygrep
tiene la-P
opción (para habilitar PCRE), puede hacer esto:La idea aquí es que
grep -P
permite que las expresiones regulares\xXX
especifiquen caracteres literales, dondeXX
está el valor ASCII hexadecimal de ese carácter. El carácter coincide literalmente, incluso si es un carácter regex especial.od
se usa para convertir el inicio de línea esperado en una lista de valores hexadecimales, que luego se unen, cada uno con el prefijo\x
printf.^
luego se antepone esta cadena para construir la expresión regular requerida.Si su
$1
es unicode, entonces esto se vuelve un poco más difícil, porque no hay una correspondencia 1: 1 de caracteres a bytes hexadecimales como salida porod
.fuente
Como un filtro:
Ejecutar en uno o más archivos:
La sección "Citar metacaracteres" de la documentación de perlre explica:
fuente
Si su grep tiene la opción -P, que significa PCRE , puede hacer esto:
Consulte esta pregunta y consulte el documento PCRE para obtener detalles si lo desea.
fuente
Si hay un carácter que no usa, puede usarlo para marcar el comienzo de la línea. Por ejemplo,
$'\a'
(ASCII 007). Es feo pero funcionará:Si no necesita la (s) línea (s) coincidentes (s), puede soltar el final
sed
y usargrep -qF
. Pero es mucho más fácil conawk
(operl
) ...fuente
Cuando desee buscar en un archivo sin bucle, puede usar:
Corte el archivo con la longitud de la cadena de búsqueda
Busque cadenas fijas y números de línea de retorno
Use los números de línea para algo como
sed -n '3p;11p' file
Cuando desee eliminar estas líneas, use
fuente