一直在寻找一个直接的答案,但没有在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
我认为我需要三个表达式,但我找不到如何选择特定的出现。
道歉,如果它显而易见,但我花了一段时间搜索和测试没有运气......
答案 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