Supongamos que tengo una lista de archivos csv con el siguiente formato:
INT_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
ASG_B1_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
El INT_V1_ y ASG_B1_V1_ es fijo, lo que significa que todos los archivos csv comienzan con él.
¿Cómo puedo dividir los nombres de archivo en variable?
Por ejemplo, quería capturar el Nombre y asignarlo a una variable $Name
.
Respuestas:
Con
zsh
:Con
bash
4.3 o más reciente, ksh93t o más nuevo o zsh en emulación sh (aunque enzsh
, preferiría simplementefield=("${(@s:_:)field}")
dividir en lugar de usar el operador sin sentido split + glob desh
) podría dividir la cadena en los_
caracteres y hacer referencia a ellos desde el final :O (bash 3.2 o más reciente):
(se supone que
$file
contiene texto válido en la configuración regional actual que no está garantizado para los nombres de archivo a menos que arregle la configuración regional en C u otra configuración regional con un solo byte por juego de caracteres).Como
zsh
el de*
arriba,.*
es codicioso . Entonces, el primero comerá la mayor cantidad*_
posible, por lo que el resto.*
solo coincidirá con_
cadenas libres.Con
ksh93
, podrías hacerEn un POSIX
sh
script, podría utilizar los${var#pattern}
,${var%pattern}
operadores de expansión de parámetros estándar:O use el operador split + glob nuevamente:
fuente
ksh: file: 0403-046 The specified subscript cannot be greater than 4095.
para${field[-1]}
o cualquier cosa en forma${x[n]}
.${field[-1]}
era parabash-4.3+
. Paraksh
, utilice cualquiera de las soluciones "POSIX". La compatibilidad con el subíndice negativo no se agregó antes de ksh93t (una característica que se origina en zsh).Puede tomar los valores de su campo
<Name>
con este comando:(o con
awk
):Y puedes ponerlos en una variable como esta:
o
No está claro en la pregunta si desea la misma variable para todos los valores o una sola variable para cada uno de ellos.
fuente
fuente
_
no es especial y no necesita ser citado. Eso supone que el nombre del archivo no contiene caracteres de nueva línea. Es posible que desee agregar a-d ''
.