簡體   English   中英

Sed 捕獲組正則表達式

[英]Sed Capture Group Regex

我有以下字符串為 output

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

我想將所有 4 個值捕獲到 bash 中的 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'

這不返回任何內容

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

您可以將帶有-o標志的值 grep 僅匹配為 output 。

這輸出4000

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

盡管很難建議它是否是在沒有更多上下文的情況下實現目標的最簡潔方法,但解析 output 格式的程序(可能在awk中?)在這里可能很有趣。

這將起作用創建一個簡單的兩語句腳本

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

您可以按照您所說的將這些值分配給變量。

您能否嘗試以下操作,它將匹配 Input_file 中的所有字符串values ,並將根據其值創建一個數組。

readarray -t arr < <\
(awk '
{
  while(match($0,/value[0-9]+:[0-9]+/)){
    val=substr($0,RSTART,RLENGTH)
    sub(/value[0-9]+:/,"",val)
    print val
    $0=substr($0,RSTART+RLENGTH)
  }
}' file
)

上面將創建一個名為arr的數組,您要訪問它的值,然后嘗試:

echo "${arr[@]}"

解析和捕獲變量的每個值:

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

我認為在@hmm 答案中遵循正則表達式可能會更短

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM