Analisar a saída de ls
é uma má ideia (a saída de ls
é estritamente para olhar). Para mais informações, consulte a pergunta " Por que * not * pars 'ls'? ".
É assim que você pode fazer isso em /bin/sh
:
for filename in t-*-*.c; do
[ ! -f "$filename" ] && continue
number=${filename#t-} # remove "t-" from start of filename
number=${number%%-*} # remove everything from first "-" in what remains
printf '%s\n' "$number"
done
Isso iterará todos os nomes de arquivos no diretório atual cujo nome corresponda ao padrão t-*-*.c
. Para cada um desses nomes, o t-
bit é retirado do início e, em seguida, o segundo -
e tudo depois é removido com outra expansão de parâmetro.
A expansão ${variable#word}
removeria a correspondência (mais curta) de word
do início de $variable
, enquanto ${variable%%word}
removeria a correspondência (mais longa) de word
do o fim da string.
Com bash
, usando a expressão regular correspondente nos nomes dos arquivos:
for filename in t-*-*.c; do
[ ! -f "$filename" ] && continue
if [[ "$filename" =~ ^t-([0-9]+)- ]]; then
printf '%s\n' "${BASH_REMATCH[1]}"
fi
done
Isso corresponderia e capturaria os dígitos após t-
em cada nome de arquivo. O grupo de dígitos capturado está disponível em ${BASH_REMATCH[1]}
após uma correspondência bem-sucedida. O índice 1
refere-se ao primeiro grupo de captura (parênteses) na expressão regular.
Para uma solução lenta, mas possivelmente confortável (como em "familiar"), convém chamar um comando externo para analisar o bit da string em que você está interessado:
for filename in t-*-*.c; do
[ ! -f "$filename" ] && continue
cut -d '-' -f 2 <<<"$filename"
done
Isso pressupõe bash
e você pode chamar cut
em um loop. Isso seria muito mais lento do que usar a operação embutida no próprio shell. O comando cut
aqui é solicitado a retornar o segundo campo -
-delimited da string passada para ele a partir de bash
(usando um redirecionamento "here-string").