解析一个字符串并提取一个由逗号分隔的单词并从 [] 括号内赋值

Parse a string and extract a word delimited by comma and assign value from inside [] brackets

我需要帮助来解析字符串并提取由逗号分隔的单词并从 [] 括号内赋值。 输入的字符串是这样的:

KEEP_DFB,?(y/n),[y];
DFB_VERSION,?(1.4.2/1.7.6),[1.4.2]:

预期输出为

KEEP_DFB=y
DFB_VERSION=1.4.2

我使用 sed 最接近的结果是:

echo 'KEEP_DFB,?(y/n),[y]:' | sed 's/\([^,]*,\).*,\([^,]*\):.*/=/'

但它没有给出预期的结果。

我也试了'cut',结果和上面一样。 不允许使用 IFS 更改定界符。 你能帮忙吗?

你的成绩相当接近:

$ printf "%s\n" 'DFB_VERSION,?(1.4.2/1.7.6),[1.4.2]:' 'KEEP_DFB,?(y/n),[y]:' |
> sed 's/\([^,]*\),.*,\[\([^],]*\)][;:].*/=/'
DFB_VERSION=1.4.2
KEEP_DFB=y
$

第一个逗号被移到捕获之外。第二次捕获前面是 \[(数据中的文字 [),后面是 ](不需要反斜杠转义,因为 ] 仅在它是字符 class 的一部分,尽管我很想添加一个字符,无论是否使用反斜杠,它都可以正常工作。

Sundeep 注意到其中一个数据行中有一个分号而不是冒号,但是 echo 中的示例数据有一个冒号而不是分号(这就是为什么我没有'在第一遍就发现了问题;我复制了原型命令)。这可以通过使用 [;:] 作为字符 class 而不是直接 :.

来轻松处理

否定字符 class 排除了 ] 和逗号——尽管不清楚为什么需要排除逗号。这意味着您不会认为这是有效的:

VERSION_LIST,?(1.2/1.3/1.4/1.7),[1.4,1.7]:

您应该试试这个代码。它应该可以正常工作。

awk -F"," '{print ,}' OFS="=" file_name | sed -e 's/\[\(.*\)\].//'

这将使用 awk 输出文件中包含的行并将分隔符替换为 =,然后替换从 [ 开始并以 ] 或任何其他字符结束的部分通过 [].

中的值

你也可以试试这个更短的:

sed -e 's/,.*\[\(.*\)\]./=/' file

两者的输出是:

KEEP_DFB=y
DFB_VERSION=1.4.2

我建议:

sed 's/,.*\[/=/;s/].//' file

输出:

KEEP_DFB=y
DFB_VERSION=1.4.2
awk -F'[][,]' '{print "="}' file 

KEEP_DFB=y
DFB_VERSION=1.4.2

你没有说明你要使用什么 shell,但对于大多数 shell,以下方法可行:

# Drop the last two characters
x=${original:0:-2}
# Store the name part
name=${x%%,*}
# Store the value part
value=${x##*\[}

例如,如果 original 包含 DFB_VERSION,?(1.4.2/1.7.6),[1.4.2]:,则 name 将包含 DFB_VERSION,而 value 将包含 1.4.2

顺便说一句,你为什么不想修改IFS?当然你不想永久改变它,但是只为一条语句修改它,不会影响程序的其余部分。

POSIX shell 方法,给定输入文件 'foo':

while IFS=',[]' read a b c d e ; do echo "$a${a:+=}$d" ; done < foo

输出:

KEEP_DFB=y
DFB_VERSION=1.4.2

@Suresh K:能否请您尝试关注并告诉我这是否对您有帮助。

awk -F, '{match([=10=],/\[.*\]/);print "="substr([=10=],RSTART+1,RLENGTH-2)}' Input_file

希望对您有所帮助。