我从这开始:
{"Allowed","20863962"}
Run Code Online (Sandbox Code Playgroud)
并且想插入label:和value:所以它看起来像这样:
{ label: "Allowed", value: "20863962" }
Run Code Online (Sandbox Code Playgroud)
我尝试使用sed,但是它替换了插入而不是插入.
echo "{"Allowed","20863962"}" | sed 's/A/label: /' | sed 's/[0-9]/value: /'
Run Code Online (Sandbox Code Playgroud)
产量
{label: llowed,value: 0863962}
Run Code Online (Sandbox Code Playgroud)
你得到了你所要求的,但这不是你想要的.
首先,输出echo
是:
{Allowed,20863962}
Run Code Online (Sandbox Code Playgroud)
因为shell剥掉了双引号.要获得正确的输入sed
,请使用:
echo '{"Allowed","20863962"}'
Run Code Online (Sandbox Code Playgroud)
然后,您的sed
命令会丢弃字符,更不用说不处理双引号,并且特定于您当前的数据.更通用的解决方案是:
sed 's/{\("[^"]*"\),\("[^"]*"\)}/{ label: \1, value: \2 }/'
Run Code Online (Sandbox Code Playgroud)
这将在双引号内查找两个字符串,{
并}
用逗号分隔它们并保存字符串(使用\(...\)
)以用作\1
和\2
.
$ echo '{"Allowed","20863962"}'| sed 's/{\("[^"]*"\),\("[^"]*"\)}/{ label: \1, value: \2 }/'
{ label: "Allowed", value: "20863962" }
$
Run Code Online (Sandbox Code Playgroud)
如果一般正则表达式太一般,一个更简单的技术是使用多个替换,在这里您可以确定在开放式大括号之后附加到空间的确切重要性,更具体地说,在闭合大括号之前:
$ echo '{"Allowed","20863962"}' |
> sed -e 's/{/{ label: /' -e 's/,/, value: /' -e 's/}/ }/'
{ label: "Allowed", value: "20863962" }
$
Run Code Online (Sandbox Code Playgroud)
两者之间的区别在于替代操作的数量及其复杂性.从某种意义上说,单一替代操作集中在琴弦上并修复周围环境; 多重替代操作集中在周围环境并修复它们.
我们可以使用它来"拯救"您的代码.请注意,sed
在此上下文中没有理由运行两次.
sed -e 's/"A/label: &/' -e 's/"[0-9]/value: &/'
Run Code Online (Sandbox Code Playgroud)
这会找到双引号,A
然后替换它,label: "A
因为它的&
意思是"匹配的内容".与第二次更换相似.这不会在{
之前或之后插入空格}
,但这可能没问题.
$ echo '{"Allowed","20863962"}' | sed -e 's/"A/label: &/' -e 's/"[0-9]/value: &/'
{label: "Allowed",value: "20863962"}
$
Run Code Online (Sandbox Code Playgroud)
如果我使用这种格式,我会在冒号之后省略空格,但那就是我......