用纯粹的bash提取字符串的中间部分

时间:2016-01-27 23:11:41

标签: linux bash

说我有...... 字符串= '第一/第二/第三'

如何仅使用纯bash(不是awk / sed等)和1行中的字符串中提取“秒”?

我知道我可以用$ {string#* /}获得'第二/第三'但是只是'第二'

谢谢!

4 个答案:

答案 0 :(得分:5)

你可以这样做:

#!/bin/env bash

STRING="first/second/third"

TEXT=$STRING
TEXT=${TEXT#*/}
TEXT=${TEXT%/*}

echo $TEXT

Bash也支持regex。这在这里很有用,以及其他需求更复杂的地方。对于您的用例,您可以轻松匹配每个部分,并将其解压缩。

#!/bin/env bash

STRING="first/second/third"

[[ $STRING =~ ^([^/]*)/([^/]*)/([^/]*)$ ]] && echo matched

echo [1] ${BASH_REMATCH[1]}
echo [2] ${BASH_REMATCH[2]}
echo [3] ${BASH_REMATCH[3]}

答案 1 :(得分:3)

一个选项:

second="$string" ; second="${second#*/}" ; second="${second%/*}"
# now "$second" is 'second'

另一种选择:

IFS=/ read -r first second third <<< "$string"
# now "$first" is 'first', "$second" is 'second', and "$third" is 'third'

答案 2 :(得分:2)

一种方法是使用IFSread

 string='first/second/third'
 IFS='/' read -r a b c <<< "${string}" && echo ${b}

打印“秒”。

答案 3 :(得分:2)

使用bash数组:

string='first/second/third'

你可以这样做:

IFS=/ read -ra arr <<< "$string" && echo "${arr[1]}"

或使用基于IFS的拆分:

(IFS=/ arr=($string) && echo "${arr[1]}")

两个命令都会打印出来:

second