从多组引号中捕获字符串

时间:2016-05-27 10:35:37

标签: regex bash sed

一直在寻找一个直接的答案,但没有在SO或更广泛的搜索中找到回答这个简单问题的任何内容:

我有一串引用的值,在这种情况下是ip地址,我想单独提取以用作其他地方的值。我打算用sed和regex做这件事。字符串格式如下:

"10.10.10.101","10.10.10.102","10.10.10.103"

我可以使用正则表达式捕获所有引号之间的值,例如:

"([^"]*)"

问题是如何单独选择每个组以便我可以使用它们?

即:

value1 = 10.10.10.101  
value2 = 10.10.10.102  
value3 = 10.10.10.103

我认为我需要三个表达式,但我找不到如何选择特定的出现。

道歉,如果它显而易见,但我花了一段时间搜索和测试没有运气......

3 个答案:

答案 0 :(得分:0)

使用grep -P您可以使用匹配重置:

s="10.10.10.101","10.10.10.102","10.10.10.103"
arr=($(grep -oP '(^|,)"\K[^"]*' <<< "$s"))

# check array content
declare -p arr
declare -a arr='([0]="10.10.10.101" [1]="10.10.10.102" [2]="10.10.10.103")'

如果您的grep不支持-P(PCRE)标记,请使用:

arr=($(grep -Eo '[.[:digit:]]+' <<< "$s"))

这是一个awk命令,它也适用于BSD awk:

awk -F '"(,")?' '{for (i=2; i<NF; i++) print $i}' <<< "$s"

答案 1 :(得分:0)

如果您有GNU awk,可以使用FPAT为每个字段设置模式:

awk -v FPAT='[0-9.]+' '{ print $1 }' <<<'"10.10.10.101","10.10.10.102","10.10.10.103"'

$1替换为$2$3以打印您想要的任何值。

由于您的字段不包含空格,您可以使用类似的方法将值读取到数组中:

read -ra ips < <(awk -v FPAT='[0-9.]+' '{ $1 = $1 }1' <<<'"10.10.10.101","10.10.10.102","10.10.10.103"')

在这里,$1 = $1使awk重新格式化每一行,以便打印字段,其间有空格。

答案 2 :(得分:0)

您可以试试bash

$ str="10.10.10.101","10.10.10.102","10.10.10.103"
$ IFS="," arr=($str)
$ echo ${arr[1]}
10.10.10.102