在bash中的特定子字符串后提取令牌

时间:2014-05-22 15:15:01

标签: bash

假设我在bash脚本中有一个包含多行的字符串变量:

blah blah blah
...
...
an interesting parameter: 12345 some other useless stuff...
...
...

我想从这个字符串中提取12345。我试图寻找使用'一个有趣的参数:'作为“分隔符”的方法,但我无法让它工作。这样做有干净的方法吗?

6 个答案:

答案 0 :(得分:4)

bash支持正则表达式匹配,无需使用外部程序。

$ str='
blah blah blah
...
...
an interesting parameter: 12345 some other useless stuff...
...
...'
$ [[ $str =~ an\ interesting\ parameter:\ ([[:digit:]]+) ]]

$ echo ${BASH_REMATCH[1]}
12345

数组BASH_REMATCH包含元素0中的完全匹配以及后续元素中捕获的子组(按从左到右的顺序)。

答案 1 :(得分:3)

试试这个sed命令,

sed -n '/interesting parameter/ s/.*parameter: \([0-9]\+\) .*/\1/p' file

对于你的情况,它将是,

sed -n '/interesting parameter/ s/.*parameter: \([0-9]\+\) .*/\1/p' <<< "$string"

答案 2 :(得分:3)

您可以使用sed:

sed -n 's/.*an interesting parameter: \([0-9]\+\).*/\1/p' <<< "$string"

答案 3 :(得分:3)

使用正则表达式进行Pure Bash:

$ a='blah blah blah
> ...
> ...
> an interesting parameter: 12345 some other useless stuff...
> ...
> ...'
$ [[ $a =~  "an interesting parameter: "([[:digit:]]+) ]] && echo "${BASH_REMATCH[1]}"
12345

使用参数扩展的纯Bash:

$ t=${a#*an interesting parameter: }
$ echo "$t"
12345 some other useless stuff...
...
...
$ u=${t%% *}
$ echo "$u"
12345

答案 4 :(得分:2)

试试这个:

grep -Po 'an interesting parameter:\s*\K\S*'

答案 5 :(得分:1)

试试这个:

cat content | grep "an interesting parameter: " | awk '{print $4}'