解析一个字符串并提取一个由逗号分隔的单词并从 [] 括号内赋值
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
希望对您有所帮助。
我需要帮助来解析字符串并提取由逗号分隔的单词并从 [] 括号内赋值。 输入的字符串是这样的:
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
希望对您有所帮助。