A menudo encuentro esto en los scripts (y, debo admitirlo, escribirlo yo mismo):
a=$(echo "$x" | sed "s/foo/bar/")
o
if echo "$x" | grep -q foo
then
...
fi
Considere "foo" para incluir algunas cosas de expresiones regulares.
Siento que debería haber, y lo más probable es , una mejor manera de expresar esto, una que no implique dos comandos y una tubería, pero que envuelva la cosa en una expresión más compacta.
Simplemente no puedo encontrarlo. ¿Cualquiera?
$()
lugar de backticks.a="$(echo "$x" | sed "s/foo/bar/")"
yif echo "$x" | grep foo; …
.Respuestas:
A menos que asuma un shell específico, no hay mejor manera de hacer esto que "eco de tubería a herramienta" (o simplemente una "herramienta" como expr ); es todo lo que realmente puede contar con el shell Bourne tradicional y / o el shell POSIX . Si considera otros proyectiles, existen otras posibilidades incorporadas.
ksh tiene
?(pattern-list)
,*(pattern-list)
,{n}(pattern-list)
,{n,m}(pattern-list)
,@(pattern-list)
,!(pattern-list)
,%P
printf para convertir una expresión regular extendida en un patrón (y%R
para una expresión regular extendida en patrón);expr == pattern
condición en las[[ expr ]]
pruebas;${param/pattern/replacement}
expansión del parámetro.bash tiene
extglob
opción para habilitar la mayoría de los patrones adicionales de ksh (no{n}
y{n,m}
);expr == pattern
condición (en[[ expr ]]
pruebas);${param/pattern/replacement}
expansión del parámetro;expr =~ extregexp
condición (en[[ expr ]]
pruebas) que puede coincidir con expresiones regulares extendidasBASH_REMATCH
parámetro, se podrían hacer reemplazos de estilo sed .zsh tiene
EXTENDED_GLOB
opción;KSH_GLOB
opción;expr == pattern
condición (en[[ expr ]]
pruebas);${pattern/pattern/replacement}
expansión del parámetro;expr =~ extregexp
condición (en[[ expr ]]
pruebas) que puede coincidir con expresiones regulares extendidas,MATCH
parámetro y elmatch
parámetro (oBASH_REMATCH
con elBASH_REMATCH
conjunto de opciones), se podrían realizar reemplazos de estilo sed ;zsh/pcre
módulo que ofrecepcre_compile
,pcre_study
ypcre_match
comandos y la condición de-pcre-match
prueba (en[[ expr ]]
pruebas);zsh/regex
módulo que ofrece la condición de-regex-match
prueba (en[[ expr ]]
pruebas).fuente
Para reemplazar la línea sed, haga algo como
${a/foo/bar}
o${a//foo/bar}
En la primera forma, solo se reemplaza la primera instancia. La segunda forma es una búsqueda y reemplazo global.
En tu caso, sería
En lugar de:
Considere usar:
Donde
foo
es una expresión regular.fuente
if [ $x =~ foo ]
da un mensaje de error aquí.if [[ $x =~ foo ]]
Sin embargo, funciona muy bien. ¡Gracias!=~
requiere bash> = 3 iirc.${a##foo}
y${a%%bar}
.=~
usa expresiones regulares. Esto es cierto, por ejemplo:[[ "abcdddde" =~ ^a.*d+.g* ]]
(eso es cero o más g's en lugar de g-wildcard, por ejemplo).Una buena forma compatible posix para probar si una variable contiene un patrón es:
La sintaxis de la expansión del parámetro es:
donde
pattern
es un patrón de shell .fuente