我有以下字符串作为输出
Config(1) = ( value1:4000 value2:2000 value3:500 value4:1000)
我想在bash中将所有4个值捕获到4个不同的变量中,我认为最简单的方法是使用正则表达式。我认为为此使用正则表达式的最佳方法是使用sed。 我已经测试过正则表达式,并且可以使用
捕获value1value1:(\d+)
使用sed,我正在根据其他答案尝试此操作:
echo "Config(1) = ( value1:4000 value2:2000 value3:500 value4:1000)" | sed -n 's/^\s*value1\:\(\d\+\)\s\?.*/\1/p'
这什么都不返回
答案 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] +)