2013-07-23 122 views
0

我有字符串包含路徑如何提取一部分字符串?

string="toto.titi.1.tata.2.abc.def" 

我想提取其中toto.titi.1.tata.2.後位於子。但1和2這裏是例子,可能是其他數字。

一般來說:我想提取位於toto.titi.[i].tata.[j].之後的子字符串。

[i][j]是數字

怎麼辦呢?

+0

你知道正則表達式工具嗎? – eyquem

回答

1

您可以使用剪切

echo $string | cut -f6- -d'.' 
0

該做的:

echo ${string} | sed -re 's/^toto\.titi\.[[:digit:]]+\.tata\.[[:digit:]]+\.//' 
0

可能是這樣的:

echo "$string" | cut -d '.' -f 6-

0

您可以使用sed。就像這樣:

string="toto.titi.1.tata.2.abc.def" 
string=$(sed 's/toto\.titi\.[0-9]\.tata\.[0-9]\.//' <<< "$string") 
echo "$string" 

輸出:

abc.def 
+0

無用的使用回聲。使用herestring,即'sed .... <<<「$ string」' – dogbane

+0

@dogbane我期望在引擎蓋下它幾乎是一樣的。但是,不過,我更新了帖子 – hek2mgl

6

bash解決方案:

[[ $string =~ toto\.titi\.[0-9]+\.tata\.[0-9]+\.(.*$) ]] && result="${BASH_REMATCH[1]}" 
echo "$result" 
+0

不錯!我在建議一個'sed'解決方案之前已經搜索過了。 – hek2mgl

+0

也可以用'\ d'而不用'[0-9]'來表示。 – devnull

+0

不,你不能。 'bash'不支持'\ d'。 – dogbane

0

試試這個AWK行:

awk -F'toto\\.titi\\.[0-9]+\\.tata\\.[0-9]+\\.' '{print $2}' file 

你的榜樣:

kent$ echo "toto.titi.1.tata.2.abc.def"|awk -F'toto\\.titi\\.[0-9]+\\.tata\\.[0-9]+\\.' '{print $2}' 
abc.def 
5

使用參數膨脹,而不是一個正則表達式的替代bash溶液:

echo "${string#toto.titi.[0-9].tata.[0-9].}" 

如果數字可以是多數位值(即,大於9),就需要使用一個擴展模式:

shopt -s extglob 
echo "${string#toto.titi.+([0-9]).tata.+([0-9]).}" 
+0

很好的答案(+1)。但您可以通過使用'echo'$ {string#toto.titi。[0-9] *。tata。[0-9] *。}「'' – MOHAMED

+0

避免使用'shopt -s extglob'這是一種模式,而不是一個正則表達式。 '[0-9] *'會匹配一個數字,然後是*任何*,而不是(可能是空的)一系列數字。 – chepner

+0

對於我的情況,我確信我的字符串只包含數字。所以對於我的情況,可以使用'[0-9] *' – MOHAMED