2013-01-15 40 views
0

我正在编写一个脚本函数来将包tar名称列表分离到包名称版本中。如何在bash中用正则表达式分隔包名?

xorg-fonts-misc-1.0b-1 
Xorg-font-bitstream-75dpi-1.0.0-2.i386 
Xorg-font-bitstream-100dpi-1.2a-2.arm 
Other-Third-Party-1.2.2-1-any 

我正在使用以下脚本来分隔名称和版本。

split_pkgname_pipe() { # split x-x-1.3-1.x -> x-x 1.3-1.x 
    [ $opt_v != 0 ] && echo "dbg:split_pkgname_pipe $*" >&2 
    awk '{ 
    f=$0 
    sub(/\-[0-9].*$/,"") 
    n=$1 
    v=substr(f, length(n)+2) 
    print n, v 
    }' 
} 

我的代码的问题会导致Xorg-font-bitstream-75dpi-1.0.0单独为Xorg-font-bitstream75dpi-1.0.0。但我想Xorg-font-bitstream-75dpi-1.0.0

[解决]

split_pkgname_pipe() { # split x-x-1.3-1.x -> x-x 1.3-1.x 
    [ $opt_v != 0 ] && echo "dbg:split_pkgname_pipe $*" >&2 
    local line namever name ver rel 
    while read line ; do 
    namever="${line%-*}" 
    rel="${line##*-}" 
    if [ `expr match $rel '[0-9]'` = 0 ] ; then # rel is 'i386/any'... 
     name="${namever%-*}" 
     ver="${namever##*-}" 
     namever="$name" 
     rel="$ver-$rel" 
    fi 
    name="${namever%-*}" 
    ver="${namever##*-}" 
    echo "$name $ver-$rel" 
    done 
} 

回答

1
$ package="Xorg-font-bitstream-75dpi-1.0.0" 
$ echo "${package%-*}" 
Xorg-font-bitstream-75dpi 
$ echo "${package##*-}" 
1.0.0 
+0

谢谢你给我的暗示。对于软件包名称来说它更复杂,所以我在问题中发布我的解决方案 –

1

试试这个

sed -re '/^(.*?)((\d[a-z]?\.)+.*)$/\1\t\2/gmi' file.txt