0

在一个目录中,我有一些看起来像的文件;

org.coy。应用程序_0.1-2_arm.deb

com.cpo. app2 _1.2.1_arm.deb

sg.team.works。app3a _1.33_arm.deb

com.share。名称4 .deb

com.sha-re。应用程序5 .deb

com.share.re. 任何东西.deb

我只需要加粗的名称。

这是我到目前为止所拥有的;

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

5 回答 5

2
for i in *.deb
do
    name=${i%.deb}      #<-- remove extension      (.deb)
    name=${name%%_*}    #<-- remove version        (_x.y.z_arm)
    name=${name##*.}    #<-- remove namespace      (comp.x.y.z)
    echo $name
done

输出

app2
anything
app5
name4
application
app3a
于 2012-04-23T10:08:56.287 回答
0

最好的解决方案是使用 dpkg-query 和适当的选项。检查更多信息

于 2012-04-23T09:50:10.033 回答
0

您可以使用 basename 命令使事情变得更容易一些

for file in *.deb; do
 name=`basename $file | sed -e 's/.*\.//' -e 's/_.*//'`
 echo $name
done
于 2012-04-23T09:52:41.083 回答
0

一种使用方式perl

perl -e '
    do { 
        printf qq[%s\n], $+{my} 
            if $ARGV[0] =~ m/(?(?=.*_)\.(?<my>[^._]+)_\d|.*\.(?<my>[^.]+)\.deb\Z)/ 
    } while shift && @ARGV
' *.deb

正则表达式的解释:

(?                          # Conditional expression.
(?=.*_)                     # Positive look-ahead to check if exits '_' in the string.
\.(?<my>[^._]+)_\d          # If previous look-ahead succeed, match string from a '.' until
                            # first '_' followed by a number.
|                           # Second alternative when look-ahead failed.
.*\.(?<my>[^.]+)\.deb\Z     # Match from '.' until end of string in '.deb'

由于我使用的是命名捕获,因此需要 perl 5.10 或更高版本。

输出:

app2
anything
app5
name4
application
app3a
于 2012-04-23T10:27:59.047 回答
0

这可能对您有用:

for file in *.deb; do
    name=$(echo "$file" |  sed 's/.*\.\([a-zA-Z][^_.]*\).*\.deb/\1/')
    echo $name
done
于 2012-04-23T13:23:02.527 回答