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),%Pprintf para convertir una expresión regular extendida en un patrón (y%Rpara una expresión regular extendida en patrón);expr == patterncondición en las[[ expr ]]pruebas;${param/pattern/replacement}expansión del parámetro.bash tiene
extglobopción para habilitar la mayoría de los patrones adicionales de ksh (no{n}y{n,m});expr == patterncondición (en[[ expr ]]pruebas);${param/pattern/replacement}expansión del parámetro;expr =~ extregexpcondición (en[[ expr ]]pruebas) que puede coincidir con expresiones regulares extendidasBASH_REMATCHparámetro, se podrían hacer reemplazos de estilo sed .zsh tiene
EXTENDED_GLOBopción;KSH_GLOBopción;expr == patterncondición (en[[ expr ]]pruebas);${pattern/pattern/replacement}expansión del parámetro;expr =~ extregexpcondición (en[[ expr ]]pruebas) que puede coincidir con expresiones regulares extendidas,MATCHparámetro y elmatchparámetro (oBASH_REMATCHcon elBASH_REMATCHconjunto de opciones), se podrían realizar reemplazos de estilo sed ;zsh/pcremódulo que ofrecepcre_compile,pcre_studyypcre_matchcomandos y la condición de-pcre-matchprueba (en[[ expr ]]pruebas);zsh/regexmódulo que ofrece la condición de-regex-matchprueba (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
fooes 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
patternes un patrón de shell .fuente