Reemplace una cadena en el nombre del directorio usando una variable

3

tengo un script configurado para hacer un nuevo directorio en una carpeta basada en una variable nombrada para otro directorio que dice así:

str="/home/folder/test"
base="$(basename $str)"

mkdir -p "/home/folder2/${base}"

Lo que estoy tratando de hacer ahora es encontrar y reemplazar una cadena en esta variable cuando se crea la nueva carpeta.

Ejemplo, tengo:

/Home/Album-Artist[FLAC] 

asignado a la variable. Cuando uso mkdir para crear el nuevo directorio, quiero encontrar y reemplazar "FLAC" por "V0", por lo que en la nueva carpeta estará

/Home/Album-Artist[V0]
    
pregunta jakeokeefe 02.04.2017 - 20:20

2 respuestas

4

Solución

Reemplaza tu línea:

base="$(basename $str)"

con:

base="$(basename $str | sed 's/FLAC/V0/')"

o, si desea que los corchetes [ y ] formen parte del patrón de búsqueda:

base="$(basename $str | sed 's/\[FLAC\]/[V0]/')"

Explicación

  • El carácter | (o pipe ) esencialmente significa "toma el resultado y aliméntalo en el siguiente programa".

  • El comando sed (editor de secuencias) toma la entrada, le aplica comandos e imprime el resultado. Por ejemplo, el comando s/FLAC/V0/ en sed significa "para cada línea de entrada, busque FLAC y sustitúyalo por V0 (pero no más de una vez)".

  • sed utiliza expresiones regulares en lugar de patrones de búsqueda fijos. Eso significa que necesitas escapar de ciertos personajes; por lo tanto, mi último ejemplo dice \[ y \] en el patrón de búsqueda (en lugar de solo [ y ] ).

respondido por el Synoli 02.04.2017 - 20:47
2

En bash , puedes llamar sed, perl, python, swift u otros idiomas.

Si estás buscando subir de nivel en bash, prueba:

${var%pattern}

El% elimina un patrón de la parte posterior de la variable, por lo que en una línea podría eliminar el final y agregar el nuevo.

new=${base%\[FLAC\]}"[V0]" ## [FLAC] to [V0] with \ to escape []  

Más clara es la función de búsqueda y reemplazo que asume que ningún artista o álbum será FLAC y se comparará. La búsqueda del final de la cola anterior ayuda a ese caso de borde, pero es más difícil de leer la intención.

new=${base/FLAC/V0}
    
respondido por el bmike 02.04.2017 - 20:57

Lea otras preguntas en las etiquetas