Bash shell脚本抓取子字符串?

时间:2012-01-07 14:09:32

标签: linux bash shell

例如 - $x=xyz.2.3.4.fc15.i686 输出要求= 15 (即在fc和.i686之间)

5 个答案:

答案 0 :(得分:15)

$ x=xyz.2.3.4.fc15.i686
$ y=${x#*fc}
$ z=${y%.*}
$ echo $z
15
  • # left strip
  • %右条

答案 1 :(得分:4)

有几种方法可以做到这一点。如果原始字符串的长度不变,则可以使用cut,如:

echo YOUR_INPUT_STRING | cut -b n-z 

其中n是起始位置,z是结束位置。

如果点数不变,请尝试:

echo YOUR_INPUT_STRING | cut -d '.' -f 5 | cut -b 3-

或者您可以使用awk

之类的内容
echo YOUR_INPUT_STRING | awk '{print gensub(".*fc([0-9]+)\.i686","\\1","g",$0)}'

HTH

答案 2 :(得分:4)

使用bashksh您无需外部实用程序:

bash-4.2$ x='xyz.2.3.4.fc15.i686'
bash-4.2$ tempx="${x#*fc}"
bash-4.2$ echo "${tempx%.i686}"
15

或者如果你想要它的位置,类似于another answer,但没有外部工具:

bash-4.2$ x='xyz.2.3.4.fc15.i686'
bash-4.2$ echo "${x:12:2}"
15

或者,如果您希望它使用正则表达式,类似于another answer但没有外部实用程序(此时仅bash):

bash-4.2$ x='xyz.2.3.4.fc15.i686'
bash-4.2$ [[ "$x" =~ fc(.+)\.i686 ]]
bash-4.2$ echo "${BASH_REMATCH[1]}"
15

答案 3 :(得分:1)

您可以使用awk

[jaypal:~/Temp] awk -F. '{print substr ($5,3,2)}' <<< x=xyz.2.3.4.fc15.i686
15

答案 4 :(得分:0)

使用sed的一种方式:

echo $x | sed 's/.*fc\([0-9]*\)\.i686/\1/'