0

我有多个看起来像的文件名;

com.test. 应用程序1.deb

com.heavy.test。应用程序2.deb

com.maybe-test。应用程序3.deb

com.crazy。应用程序 4 .deb

我只想得到粗体字符串。到目前为止,我有这个,

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

编辑:我在同一个目录中有其他文件,它们的名称类似于;

com.公司。名称_1.0.2_arm.deb

目前,我的代码看起来像;

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

3 回答 3

1

您需要负匹配,以便可以从要捕获的字符串部分中排除点。我还锚定了字符串,这样你就不会对像com.deboop.foo.deb.

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

(编辑以反映评论)

于 2012-04-23T06:36:30.063 回答
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
于 2012-04-23T06:37:10.007 回答
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)}')
于 2012-04-23T07:16:49.093 回答