插入sed

pab*_*808 1 bash sed

我从这开始:

{"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)

Jon*_*ler 7

你得到了你所要求的,但这不是你想要的.

首先,输出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)

如果我使用这种格式,我会在冒号之后省略空格,但那就是我......