Sed Capture Group正则表达式

时间:2019-10-05 16:55:18

标签: regex bash sed

我有以下字符串作为输出

Config(1) = ( value1:4000 value2:2000 value3:500 value4:1000)

我想在bash中将所有4个值捕获到4个不同的变量中,我认为最简单的方法是使用正则表达式。我认为为此使用正则表达式的最佳方法是使用sed。 我已经测试过正则表达式,并且可以使用

捕获value1
value1:(\d+)

使用sed,我正在根据其他答案尝试此操作:

echo "Config(1) = ( value1:4000 value2:2000 value3:500 value4:1000)" | sed -n 's/^\s*value1\:\(\d\+\)\s\?.*/\1/p'

这什么都不返回

5 个答案:

答案 0 :(得分:4)

BASH本身支持正则表达式:

#!/bin/bash

s='Config(1) = ( value1:4000 value2:2000 value3:500 value4:1000)'
pattern='value1:([0-9]+) value2:([0-9]+) value3:([0-9]+) value4:([0-9]+)'

if [[ "$s" =~ $pattern ]]
then
        echo "${BASH_REMATCH[1]}"
        echo "${BASH_REMATCH[2]}"
        echo "${BASH_REMATCH[3]}"
        echo "${BASH_REMATCH[4]}"
fi
4000
2000
500
1000

答案 1 :(得分:0)

您可以使用-o标志grep输入值,以仅输出匹配项。

这将输出4000

echo "Config(1) = ( value1:4000 value2:2000 value3:500 value4:1000)" | grep -Po '(?<=value1:)\d+'

尽管很难建议它是否是在没​​有更多上下文的情况下实现目标的最简洁的方法,但是解析输出格式的程序(可能用awk?)在这里可能很有趣。

答案 2 :(得分:0)

这将起作用 创建一个简单的两个语句脚本

var=`echo "Config(1) = ( value1:4000 value2:2000 value3:500 value4:1000)" | grep -Eo "\( .*\)"|sed 's/^.\(.*\).$/\1/'`
for v in $var; do
 echo $v| awk -F: '{print $2}'
done

运行方式

root@114855-T480:/home/yadav22ji# ./tpr
4000
2000
500
1000

您可以按照您所说的将这些值分配给变量。

答案 3 :(得分:0)

解析并捕获变量的每个值:

result=`echo "Config(1) = ( value1:4000 value2:2000 value3:500 value4:1000)"`
declare -A variables=( ["variableone"]="1" ["variabletwo"]="2" ["variablethree"]="3" ["variablefour"]="4" )
for index in ${!variables[*]}
do
    export $index=$(echo $result | tr ' ' '\n' | sed "s/[()]//g" |  grep value | awk -F ":" '{print $2}' | head -"${variables[$index]}" | tail -1)
done

数组项-变量名

数组索引-在头命令中使用计数器行


[root@centos ~]# env | grep variable
variablefour=1000
variableone=4000
variabletwo=2000
variablethree=500

答案 4 :(得分:0)

我认为在@hmm答案中遵循正则表达式的形式可能更短

  

值[0-9] {1}:([0-9] +)