Suponha que eu tenha uma lista de arquivos csv com o seguinte formato:
INT_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
ASG_B1_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
O INT_V1_ e ASG_B1_V1_ é fixo, o que significa que todos os arquivos csv começam com ele.
Como posso dividir os nomes dos arquivos em variáveis?
Por exemplo, eu queria capturar o Nome e atribuí-lo a uma variável $Name
.
Respostas:
Com
zsh
:Com a
bash
versão 4.3 ou mais recente, ksh93t ou mais recente ou zsh na emulação sh (no entantozsh
, você prefere simplesmentefield=("${(@s:_:)field}")
dividir do que usar o operador sem sentido split + globsh
), você pode dividir a string em_
caracteres e referenciá-los a partir do final :Ou (bash 3.2 ou mais recente):
(que pressupõe que
$file
contenha texto válido no código de idioma atual, que não é garantido para nomes de arquivos, a menos que você fixe o código de idioma em C ou outro código de idioma com um byte único por conjunto de caracteres).Como
zsh
é*
acima, o.*
é ganancioso . Portanto, o primeiro comerá o maior número*_
possível, de modo que o restante.*
corresponderá apenas a_
cadeias livres.Com
ksh93
, você poderia fazerEm um POSIX
sh
script, você poderia usar os${var#pattern}
,${var%pattern}
operadores de expansão de parâmetro padrão:Ou use o operador split + glob novamente:
fonte
ksh: file: 0403-046 The specified subscript cannot be greater than 4095.
para${field[-1]}
ou qualquer coisa na forma${x[n]}
.${field[-1]}
era parabash-4.3+
. Paraksh
, use qualquer uma das soluções "POSIX". O suporte para subscrito negativo não foi adicionado antes do ksh93t (um recurso originário do zsh).Você pode pegar os valores do seu campo
<Name>
com este comando:(ou com
awk
):E você pode colocá-los em uma variável como esta:
ou
Não está claro na pergunta se você deseja a mesma variável para todos os valores ou uma única variável para cada um deles.
fonte
fonte
_
não é especial e não precisa ser citado. Isso pressupõe que o nome do arquivo não contenha caracteres de nova linha. Você pode adicionar um-d ''
.