2013-06-20 196 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]*}