一直在寻找这个问题的直接答案,但在SO或更广泛的搜索中没有找到任何可以回答这个简单问题的内容:
我有一串带引号的值,在本例中为 IP 地址,我想单独提取这些值以用作其他地方的值。我打算用 sed 和正则表达式来做到这一点。 字符串格式如下所示:
"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
我假设我需要三个表达式,但我找不到如何选择特定的出现。
抱歉,如果很明显,但我花了一段时间搜索和测试,但没有运气......
你可以试试这个bash
:
$ str="10.10.10.101","10.10.10.102","10.10.10.103"
$ IFS="," arr=($str)
$ echo ${arr[1]}
10.10.10.102
如果你有 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 重新格式化每一行,以便字段打印时中间有空格。
使用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"