txt siguientes sera regulares por líneas las expresiones ejemplos egrep devuelta cuál comando avanzado regex bash conditional negate

regex - siguientes - if expresiones regulares bash



¿Cómo puedo negar una prueba con expresiones regulares en un script bash? (5)

Usando GNU bash (versión 4.0.35 (1) -release (x86_64-suse-linux-gnu), me gustaría negar una prueba con expresiones regulares. Por ejemplo, me gustaría agregar condicionalmente una ruta a la variable PATH, si el camino no está ya allí, como en:

TEMP=/mnt/silo/bin if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi TEMP=/mnt/silo/Scripts: if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi TEMP=/mnt/silo/local/bin if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi export PATH

Estoy seguro de que hay un millón de formas de hacerlo, pero lo que me gustaría saber es si el condicional puede ser negado de alguna manera, como en (lo erróneo):

TEMP=/mnt/silo/bin if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi TEMP=/mnt/silo/Scripts: if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi TEMP=/mnt/silo/local/bin if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi export PATH

¡Gracias!


Lo hiciste bien, ¡solo pon un espacio entre el ! y el [[ como if ! [[ if ! [[


Me gusta simplificar el código sin usar operadores condicionales en tales casos:

TEMP=/mnt/silo/bin [[ ${PATH} =~ ${TEMP} ]] || PATH=$PATH:$TEMP


Sí, puede negar la prueba como SiegeX ya ha señalado.

Sin embargo, no debe usar expresiones regulares para esto; puede fallar si su ruta contiene caracteres especiales. Pruebe esto en su lugar:

[[ ":$PATH:" != *":$1:"* ]]

(Source)


También puede poner el signo de admiración dentro de los corchetes:

if [[ ! $PATH =~ $temp ]]

pero debe anclar su patrón para reducir los falsos positivos:

temp=/mnt/silo/bin pattern="(^|:)$temp(:|$)" if [[ ! $PATH =~ $pattern ]]

que busca una coincidencia al principio o al final con dos puntos antes o después (o ambos). Recomiendo usar nombres de variables minúsculas o mixtas como hábito para reducir la posibilidad de colisiones de nombres con variables de shell.


la forma más segura es poner el! para la negación de expresiones regulares dentro de [[ ]] como esta:

if [[ ! ${STR} =~ YOUR_REGEX ]]; then

de lo contrario, podría fallar en ciertos sistemas.