2012-04-23 4 views
0

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

com.test. приложение 1 .deb

com.heavy.test. приложение2 .deb

com.maybe-test. приложение 3 .deb

com.crazy. app-4 .deb

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

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

EDIT: У меня есть другие файлы в той же директории, что бы назвать что-то подобное;

com.company. имя _1.0.2_arm.deb

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

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

С тех пор как вы задали [тот же вопрос] (http://stackoverflow.com/q/10277736/7552) через 2 часа, вы можете закрыть этот. –

ответ

1

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

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

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

+0

молодец! оно работает! – AlwynIsPat

+0

По-видимому, есть файлы, которые называются как com.coy. ** имя ** _0.01_arm.deb в пределах того же каталога, как насчет этих? – AlwynIsPat

+0

Являются ли '_' частью названия? Также я бы предложил найти ресурс регулярных выражений и научиться строить их самостоятельно, вместо того, чтобы полагаться на других людей, чтобы сделать это за вас. Но как написано: '^. * \ ([^.] [^.] * \) \ (_ [0-9] [0-9] * \. [0-9] [0-9] * _ arm \) * \. Деб $ '. – geekosaur

1
$> cat text 
com.test.app1.deb 
com.heavy.test.app2.deb 
com.maybe-test.app3.deb 
com.crazy.app-4.deb 

$> sed -r "s/.*\.([^\.]*)\.deb$/\1/" ./text 
app1 
app2 
app3 
app-4 
+0

+1 Но я не думаю, что '.' нуждается в backslashed внутри класса символов. – potong

1
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)}') 
Смежные вопросы