假设我在bash脚本中有一个包含多行的字符串变量:
blah blah blah
...
...
an interesting parameter: 12345 some other useless stuff...
...
...
我想从这个字符串中提取12345。我试图寻找使用'一个有趣的参数:'作为“分隔符”的方法,但我无法让它工作。这样做有干净的方法吗?
答案 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}'