Me he escrito un programa de linux. program
que necesita una expresión regular como entrada.
Quiero llamar al programa en el bash
shell y pase esa expresión regular como un argumento de línea de comando al programa (también hay otros argumentos de línea de comando). Una expresión regular típica parece
[abc]\_[x|y]
Desafortunadamente los personajes [
, ]
y |
son caracteres especiales en bash
. Por lo tanto, llamando
program [abc]\_[x|y] anotheragument
no funciona ¿Hay alguna forma de pasar la expresión usando algún tipo de caracteres de escape o comillas, etc.?
(Vocación program "[abc]\_[x|y] anotheragument"
Tampoco funciona, porque interpreta los dos argumentos como uno.
fuente
"$HOME"
o parámetros"${USER:-root}"
, sustitución de comandos en cualquier forma"$(date)"
o"`date`"
expansión aritmética"$((1 + 2))"
expansión de la historia"!!"
o barra invertida de escape"\\"
. Utilice comillas simples en su lugar. Consulte la página de manual del manual de bash, la sección titulada "Cotización".Utilice comillas simples. Las comillas simples aseguran que ninguno de los caracteres sea interpretado.
Hay dos soluciones si necesita insertar una sola cita:
fuente
Por
man bash
fuente
Puede utilizar una barra invertida (
\
) delante de personajes especiales para escapar de ellos así:fuente
Aunque podría no ser útil como una expresión regular, algunas secuencias de caracteres pueden interpretarse como nombres de variables Bash. Para evitar que esto ocurra y evitar que se expandan, use comillas simples en lugar de comillas dobles:
Cita cada argumento por separado (si es que necesitan una cita) para que sean interpretados como argumentos independientes. También puedes usar matrices en algunos casos:
fuente
fuente
Escapar de ellos debería funcionar bien:
fuente
¿De dónde viene el patrón? ¿Es fijo o es de un usuario? ¿Es el usuario el que invoca el script en el sistema local o alguien remoto?
Utiliza comillas para envolver los datos para evitar que el shell los interprete. Hay dos opciones:
Porque
$
es un carácter válido en las expresiones regulares (final de línea / búfer) que probablemente desee usar comillas simples para mantener la expresión regular, a menos que esté almacenado en una variable. Si está tomando datos arbitrarios de alguien que no es de confianza, deberá reemplazar'
con'"'"'
y luego envolver en comillas simples.Tenga en cuenta que
[abc]_[x|y]
parece que quieres emparejarx
oy
, mientras que en realidad coincide con uno de los tres personajesxy|
. Los corchetes coinciden con los caracteres dentro y solo-
para rangos y un^
Al comienzo de la negación. Asi que,[abc]_(x|y)
puede ser lo que quisiste decir, y los paréntesis son los caracteres que son especiales para el shell. Los corchetes son no Especial para shell, solo parece que son. Doble corchetes[[ ... ]]
son especialesfuente
'
con'"'"'
), sin embargo, todavía no es correcto.[
ES un carácter especial para shell, se usa en comodines cuando se realiza path-expansion (que shell hace para todo lo que no está entre comillas).foo=a[b]
y entoncesecho $foo
y ver que la cadena no necesitaba citarse. Tienes razón, fui demasiado breve.ab
en el directorio actual, y luegofoo
contendráab
más bien quea[b]
. Cita tus corchetes, gente.setopt glob_assign
para habilitar este comportamiento también, entonces citar es la respuesta más segura.