Sed Capture Group Regex - PullRequest
       16

Sed Capture Group Regex

1 голос
/ 05 октября 2019

У меня есть следующая строка в качестве вывода

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

Я хочу собрать все 4 значения в 4 различных переменных в bash, и я думаю, что самый чистый способ сделать это с помощью регулярных выражений. И я думаю, что лучший способ использовать регулярные выражения для этого с помощью sed. Я протестировал регулярное выражение и могу захватить значение1 с помощью

value1:(\d+)

С помощью sed Я пытаюсь сделать это на основе других ответов:

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

Это ничего не возвращает

Ответы [ 5 ]

4 голосов
/ 05 октября 2019

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
0 голосов
/ 05 октября 2019

Я думаю, что следующее регулярное выражение может быть более короткой формой в ответе @hmm

значение [0-9] {1}: ([0-9] +)

0 голосов
/ 05 октября 2019

Разбор и захват каждого значения переменной:

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

Элемент массива - имя переменной

Индекс массива - строка счетчика с использованием команды head


[root@centos ~]# env | grep variable
variablefour=1000
variableone=4000
variabletwo=2000
variablethree=500
0 голосов
/ 05 октября 2019

Это будет работать Создать простой скрипт двух операторов

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

Вы можете назначить эти значения переменным, как вы сказали.

0 голосов
/ 05 октября 2019

Вы можете использовать grep для значения с флагом -o, чтобы выводить только совпадение.

Это выводит 4000

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

Хотя сложно посоветовать, если этоСамый чистый способ достичь цели без дополнительного контекста - программа (в awk может быть?), которая анализирует этот формат вывода, может быть интересна здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...