
Consulte la siguiente transcripción de la sesión:
$ mkdir temp
$ cd temp/
$ touch file{1..5}
$ ls
file1 file2 file3 file4 file5
$ SRC=file; TGT=ram
$ for f in file* ; do mv $f ${f/$SRC/$TGT} ; done
$ ls
ram1 ram2 ram3 ram4 ram5
$ PAT=ram/file
$ for f in ram* ; do mv $f ${f/$PAT} ; done
mv: 'ram1' and 'ram1' are the same file
mv: 'ram2' and 'ram2' are the same file
mv: 'ram3' and 'ram3' are the same file
mv: 'ram4' and 'ram4' are the same file
mv: 'ram5' and 'ram5' are the same file
¿Por qué funciona la sustitución de patrones si proporciono SRC
y TGT
como variables separadas y no si las proporciono como una única variable PAT
?
Tengo entendido que las sustituciones se procesan de adentro hacia afuera, por lo que la cadena dentro del conjunto externo de llaves, es decir, f/$SRC/$TGT
o f/$PAT
debe procesarse igualmente para f/file/ram
o f/ram/file
, que luego se procesa nuevamente para dar el nuevo nombre de archivo real. Pero al parecer esto no se hace así…
Estoy usando Bash 4.4.18 en Kubuntu Bionic LTS con las últimas actualizaciones.
Respuesta1
${parameter/pattern/string}
Sepattern
expande para producir un patrón tal como en la expansión del nombre de archivo. [...] Sistring
es nulo, las coincidencias depattern
se eliminan y/
se puede omitir el siguiente patrón.
Por lo tanto, el proceso no es tal que el patrón y el reemplazo se determinen después de la expansión. En cambio, primero se identifican el patrón y los componentes de reemplazo, yentoncesestán ampliados. En ${f/$PAT}
, la totalidad de $PAT
se convierte en el patrón y el reemplazo está vacío.