У меня есть папка со следующими файлами:
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? Заранее спасибо.
решение1
Попробуй это:
ls -1 | sed 's/_img.*//;s/.*_//'
решение2
Есть несколько способов сделать это, в зависимости от точного форматирования имен и того, что вы планируете с ними делать. Самым простым, вероятно, будет 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
на команду по вашему выбору. Оба варианта можно изменить, чтобы они лучше соответствовали формату, если у вас другой формат в целом.