Сценарий оболочки Bash для захвата подстроки? - PullRequest
1 голос
/ 07 января 2012

Например - $x=xyz.2.3.4.fc15.i686 для выхода требуется = 15 (то есть между fc и .i686)

Ответы [ 5 ]

15 голосов
/ 07 января 2012
$ x=xyz.2.3.4.fc15.i686
$ y=${x#*fc}
$ z=${y%.*}
$ echo $z
15
  • # левая полоса
  • % правая полоса
4 голосов
/ 07 января 2012

С bash или ksh вам не нужна внешняя утилита:

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

Или, если хотите, по позиции, аналогично другому ответу , но без внешних утилит:

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

Или, если хотите, с регулярным выражением, похожим на другой ответ , но без внешних утилит (только на этот раз 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
4 голосов
/ 07 января 2012

Есть несколько способов сделать это. Если длина исходной строки постоянна, вы можете использовать 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)}'

НТН

1 голос
/ 08 января 2012

Вы можете использовать awk

[jaypal:~/Temp] awk -F. '{print substr ($5,3,2)}' <<< x=xyz.2.3.4.fc15.i686
15
0 голосов
/ 07 января 2012

В одну сторону, используя sed:

echo $x | sed 's/.*fc\([0-9]*\)\.i686/\1/'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...