2013-06-20 158 views
1

我:需要从一个字符串中提取字符串

/var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz 
/var/cache/pacman/pkg/vim-7.3.918-2-x86_64.pkg.tar.xz 

格式是:

cachedir    package  packageVersion packageRelease architecture extesnion 
/var/cache/pacman/pkg/ vim-runtime 7.3.754  1    x86_64  pkg.tar.xz 
/var/cache/pacman/pkg/ vim   7.3.918  2    x86_64  pkg.tar.xz 

所以我还想与能够从原始字符串 提取任何对那些落得*包中可以有连字符

任何帮助都会被满足

+2

确定版本号也无法启动与非数字字符串li ke'alpha'? – l0b0

+0

抱歉,版本号可能包含文字,如您所说 –

+0

@ JR93检查我的答案。如果版本号不能*开始*像'alpha'这样的东西,它会起作用。这可能不适用于GNU软件包,它是我可以为你做的最多的 – hek2mgl

回答

1

使用basename连同sed

basename "/var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz" \ 
| sed 's/\([a-z\-]*\)\-\(.*\)/\1/i' 

输出:

vim-runtime # or .. 
vim 
+0

这似乎工作,非常感谢 –

0

提示:

$ cachedir=$(dirname /var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz) 
$ printf '%s\n' "$cachedir" 
/var/cache/pacman/pkg 

$ basename=$(basename /var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz) 
$ printf '%s\n' "$basename" 
vim-runtime-7.3.754-1-x86_64.pkg.tar.xz 

$ IFS=- read -a components <<< "$basename" 
$ printf '%s\n' "${components[@]}" 
vim 
runtime 
7.3.754 
1 
x86_64.pkg.tar.xz 

$ printf '%s\n' "${components[-1]}" 
x86_64.pkg.tar.xz 

$ extension="${components[-1]#*.}" 
$ printf '%s\n' "$extension" 
pkg.tar.xz 

$ architecture="${components[-1]%%.*}" 
$ printf '%s\n' "$architecture" 
x86_64 

$ packageRelease="${components[-2]%%.*}" 
$ printf '%s\n' "$packageRelease" 
1 

$ packageVersion="${components[-3]}" 
$ printf '%s\n' "$packageVersion" 
7.3.754 

$ package=$(echo "${components[@]:0:$((${#components[@]} - 3))}" | tr -s ' ' '-') 
$ printf '%s\n' "$package" 
vim-runtime 
+2

-1,因为这并没有解决问题 – hek2mgl

+0

奇怪。我认为这个网站应该教人... – l0b0

+0

好吧,但再次读这个问题我相信你会看到自己的问题。您的答案不适用于自动化解决方案,因为您不知道包名的数量以及版本号的数量。它可以是'vim'或'vim-runtime'或者甚至是(虚拟的)'vim-runtime-dev'。这里的问题是找到一个解决方案,可以处理这个 – hek2mgl

0

这样的:

var='/var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz'; basename ${var%%-[0-9]*}