从几组引号中捕获字符串



一直在寻找这个问题的直接答案,但在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"

相关内容

  • 没有找到相关文章

最新更新