O Bash pode fazer o que sem invocar processos externos.
Se fname
terminar com 11 números, isso os removerá:
[[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}
Notas:
-
Como essa abordagem não requer a criação de subshells ou processos externos, ela será mais rápida. Se essa tarefa for realizada em um loop, a velocidade poderá ser importante.
-
A substituição de comandos,
$(...)
, tem efeitos colaterais que talvez você não queira. O shell, por exemplo, retira novas linhas da substituição do comando. -
Essa abordagem não é POSIX. Requer bash.
Exemplos
Isso ilustra a remoção dos últimos 11 dígitos:
$ fname="1a.out12345678901"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out
Se fname terminar com mais de 11 dígitos, somente os últimos 11 serão removidos:
$ fname="1a.out012345678901"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out0
Se fname terminar com menos de 11 dígitos, nenhum será removido:
$ fname="1a.out1234567890"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out1234567890