Извлечь часть имени файла

У меня есть несколько имен файлов, которые выглядят примерно так:

com.test. app1 .deb

com.heavy.test. app2 .deb

com.maybe-test. app3 .deb

com.crazy. app-4 .deb

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

name=$(echo $file | sed 's!\(*.\)\(.*\).deb!\2!')

РЕДАКТИРОВАТЬ: у меня есть другие файлы в том же каталоге, которые будут называть что-то вроде;

com.company. name _1.0.2_arm.deb

В настоящее время мой код выглядит так:

for file in *.deb; do
 name=$(echo "$file" | sed 's/^.*\.\([^.][^.]*\)\.deb$/\1/')
 echo $name
done

person AlwynIsPat    schedule 23.04.2012    source источник
comment
Поскольку через 2 часа вы задали тот же вопрос, вы можете закрыть и этот.   -  person glenn jackman    schedule 23.04.2012


Ответы (3)


Вам нужно отрицательное совпадение, чтобы можно было исключить точки из той части строки, которую вы хотите захватить. Я также закрепил строку, чтобы вас не удивило такое имя, как com.deboop.foo.deb.

name=$(echo "$file" | sed 's/^.*\.\([^.][^.]*\)\(_[-.0-9][-.0-9]*_arm\)*\.deb$/\1/')

(отредактировано, чтобы отразить комментарии)

person geekosaur    schedule 23.04.2012
comment
по-видимому, есть файлы, которые называются что-то вроде com.coy. name _0.01_arm.deb в том же каталоге, как насчет этого? - person AlwynIsPat; 23.04.2012
comment
Является ли _s частью имени? Также я бы посоветовал найти ресурс регулярных выражений и научиться создавать их самостоятельно, вместо того, чтобы полагаться на других людей, которые сделают это за вас. Но как написано: ^.*\([^.][^.]*\)\(_[0-9][0-9]*\.[0-9][0-9]*_arm\)*\.deb$. - person geekosaur; 23.04.2012
comment
Я понимаю основы, но когда доходит до этих этапов, это действительно сложно понять, но я пытаюсь. :) - person AlwynIsPat; 23.04.2012
comment
Извините, этот вопрос был двусмысленным; Я спрашивал, были ли они здесь для акцента или как действительные символы в исходном имени файла. - person geekosaur; 23.04.2012
comment
они присутствуют в имени файла как символы. некоторые файлы будут выглядеть как org.test. приложение _1.2.3-4_arm.deb - person AlwynIsPat; 23.04.2012
comment
Еще одна вариация не упоминается. Есть еще сюрпризы? Обновлен основной ответ, чтобы отразить это. - person geekosaur; 23.04.2012
comment
извини, братан, не ожидал, что произойдёт так много изменений. Попробую еще раз. Спасибо чувак! со всеми этими {/ \} [есть ли генератор для этого? - person AlwynIsPat; 23.04.2012

pearl.238> cat file1
com.test.app1.deb
com.heavy.test.app2.deb
com.maybe-test.app3.deb
com.crazy.app-4.deb
pearl.239> awk -F. '{print $(NF-1)}' file1
app1
app2
app3
app-4
pearl.240> 

вы должны использовать в своем скрипте следующее.

name=$(echo $file |awk -F. '{print $(NF-1)}')
person Vijay    schedule 23.04.2012

person    schedule
comment
+1 Но я не думаю, что . нужно использовать обратную косую черту внутри класса символов. - person potong; 23.04.2012