2013-07-23 125 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