У меня есть папка со следующими файлами:

ondemand_kvm131_img.2
vm114_img.2
vm114_img.3
ondemand_vm205_img.3
label_ondemand_kvm131_img.1
vm117_img.1

Я хотел бы отображать только "имена", поэтому в этом случае вывод должен быть

kvm131
vm114
vm114
vm205
kvm131
vm117

Как это может быть сделано? Используя sed? Grep? Заранее спасибо.

2 ответа2

3

Это можно сделать несколькими способами, в зависимости от точного форматирования имен и того, что вы планируете с этим делать. Наиболее простым, вероятно, будет ls | sed:

$ ls | sed 's/^\(.*_\)*\([^_]*\)_img\.[0-9]/\2/'
kvm131
kvm131
vm205
vm114
vm114
vm117

Если ваши имена файлов нормальны, и вы просто хотите визуально выглядеть, это будет хорошо, но если вы делаете больше с именами, есть вероятность ошибок в нечетных именах файлов. Вы можете получить их индивидуально так:

$ for file in *; do left=${file%_img.?}; base=${left##*_}; echo $base; done 
kvm131
kvm131
vm205
vm114
vm114
vm117

Замените echo с вашей командой выбора. Оба из них могут быть изменены, чтобы соответствовать формату более близко, если у вас есть другой формат в целом.

1

Попробуй это:

ls -1 | sed 's/_img.*//;s/.*_//'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .