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. name4 .deb

com.sha-re. app5 .deb

com.sha.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

を使用した片道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

basename コマンドを使用して、物事を少し簡単にすることができます

for file in *.deb; do
 name=`basename $file | sed -e 's/.*\.//' -e 's/_.*//'`
 echo $name
done
于 2012-04-23T09:52:41.083 に答える
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 に答える