variable remove management from delete bash

remove - Eliminar un prefijo/sufijo fijo de una cadena en Bash



delete word string bash (8)

¿Sabes la longitud de tu prefijo y sufijo? En tu caso:

result=$(echo $string | cut -c5- | rev | cut -c3- | rev)

O más general:

result=$(echo $string | cut -c$((${#prefix}+1))- | rev | cut -c$((${#suffix}+1))- | rev)

¡Pero la solución de Adrian Frühwirth es genial! ¡No sabía sobre eso!

En mi script bash tengo una cadena y su prefijo / sufijo. Necesito eliminar el prefijo / sufijo de la cadena original.

Por ejemplo, digamos que tengo los siguientes valores:

string="hello-world" prefix="hell" suffix="ld"

¿Cómo llego al siguiente resultado?

result="o-wor"


Solución pequeña y universal:

expr "$string" : "$prefix/(.*/)$suffix"


Usando el operador =~

$ string="hello-world" $ prefix="hell" $ suffix="ld" $ [[ "$string" =~ ^$prefix(.*)$suffix$ ]] && echo "${BASH_REMATCH[1]}" o-wor


Usando la respuesta de @Adrian Frühwirth:

function strip { local STRING=${1#$"$2"} echo ${STRING%$"$2"} }

utilízalo así

HELLO=":hello:" HELLO=$(strip "$HELLO" ":") echo $HELLO # hello


Utilizando sed:

$ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//" o-wor

Dentro del comando sed, el carácter ^ coincide con el texto que comienza con $prefix , y el final $ coincide con el texto que termina con $suffix .

Adrian Frühwirth hace algunos buenos puntos en los comentarios a continuación, pero para este propósito puede ser muy útil. El hecho de que los contenidos de $ prefix y $ sufix se interpreten por sed puede ser bueno o malo, siempre que preste atención, debería estar bien. La belleza es que puedes hacer algo como esto:

$ prefix=''^.*ll'' $ suffix=''ld$'' $ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//" o-wor

que puede ser lo que quieras, y es más sofisticado y poderoso que la sustitución de variables bash. Si recuerdas que con gran poder viene una gran responsabilidad (como dice Spiderman), deberías estar bien.

Se puede encontrar una introducción rápida a sed en http://evc-cit.info/cit052/sed_tutorial.html

Una nota sobre la concha y su uso de cuerdas:

Para el ejemplo particular dado, lo siguiente también funcionaría:

$ echo $string | sed -e s/^$prefix// -e s/$suffix$//

... pero solo porque

  1. A echo no le importa cuántas cadenas hay en su lista de argumentos, y
  2. No hay espacios en $ prefijo y $ sufijo

En general, es una buena práctica citar una cadena en la línea de comando porque incluso si contiene espacios se presentará al comando como un solo argumento. Cotizamos $ prefix y $ sufijo por el mismo motivo: cada comando de edición a sed se pasará como una cadena. Utilizamos comillas dobles porque permiten la interpolación de variables; si hubiéramos usado comillas simples, el comando sed habría obtenido un $prefix literal y $suffix que ciertamente no es lo que queríamos.

Tenga en cuenta, también, mi uso de comillas simples al configurar el prefix y el suffix las variables. Ciertamente, no queremos que se interprete nada en las cuerdas, por lo que las citamos de forma individual para que no se produzca interpolación. Una vez más, puede que no sea necesario en este ejemplo, pero es un muy buen hábito.


Utilizo grep para eliminar prefijos de las rutas (que no se manejan bien con sed ):

echo "$input" | grep -oP "^$prefix/K.*"

/K elimina de la coincidencia todos los caracteres anteriores.


$ foo=${string#"$prefix"} $ foo=${foo%"$suffix"} $ echo "${foo}" o-wor


$ string="hello-world" $ prefix="hell" $ suffix="ld" $ #remove "hell" from "hello-world" if "hell" is found at the beginning. $ prefix_removed_string=${string/#$prefix} $ #remove "ld" from "o-world" if "ld" is found at the end. $ suffix_removed_String=${prefix_removed_string/%$suffix} $ echo $suffix_removed_String o-wor

Notas:

# $ prefijo: agregar # se asegura de que la subcadena "infierno" se elimine solo si se encuentra al principio. % $ sufijo: agregar% se asegura de que la subcadena "ld" se elimine solo si se encuentra en el final.

Sin estos, las subcadenas "hell" y "ld" se eliminarán en todas partes, incluso si se encuentran en el medio.