Tente isto:
ls -1 | sed 's/_img.*//;s/.*_//'
Eu tenho uma pasta com os seguintes arquivos:
ondemand_kvm131_img.2
vm114_img.2
vm114_img.3
ondemand_vm205_img.3
label_ondemand_kvm131_img.1
vm117_img.1
Gostaria que apenas exibisse os "nomes", portanto, neste caso, a saída deve ser
kvm131
vm114
vm114
vm205
kvm131
vm117
Como isso pode ser feito? Usando sed? Grep? Agradecemos antecipadamente.
Existem várias maneiras de fazer isso, dependendo da formatação precisa dos nomes e do que você pretende fazer com ele. O mais simples provavelmente seria um ls | sed
:
$ ls | sed 's/^\(.*_\)*\([^_]*\)_img\.[0-9]//'
kvm131
kvm131
vm205
vm114
vm114
vm117
Se os seus nomes de arquivo forem são e você só quiser uma aparência visual, isso funcionará bem, mas se você estiver fazendo mais com os nomes, existe a possibilidade de erros em nomes de arquivos ímpares. Você pode obtê-los individualmente assim:
$ for file in *; do left=${file%_img.?}; base=${left##*_}; echo $base; done
kvm131
kvm131
vm205
vm114
vm114
vm117
Substitua o echo
pelo seu comando de escolha. Ambos podem ser alterados para corresponder ao formato mais de perto, se você tiver um formato diferente no geral.