1

我从这个开始:

{"Allowed","20863962"}

并想插入标签:值:所以它看起来像这样:

{ label: "Allowed", value: "20863962" }

我尝试使用 sed,但它进行了替换,而不是插入。

echo "{"Allowed","20863962"}" | sed 's/A/label: /' | sed 's/[0-9]/value: /'

输出

{label: llowed,value: 0863962}
4

3 回答 3

7

你得到了你想要的,但这不是你想要的。

首先,输出echo是:

{Allowed,20863962}

因为shell去掉了双引号。要获得正确的输入sed,请使用:

echo '{"Allowed","20863962"}'

然后您的sed命令会删除字符,更不用说不处理双引号,并且高度特定于您当前的数据。更通用的解决方案是:

sed 's/{\("[^"]*"\),\("[^"]*"\)}/{ label: \1, value: \2 }/'

这会在双引号内查找两个字符串,{}用逗号分隔它们,并保存字符串(使用\(...\))以用作\1\2

$ echo '{"Allowed","20863962"}'| sed 's/{\("[^"]*"\),\("[^"]*"\)}/{ label: \1, value: \2 }/'
{ label: "Allowed", value: "20863962" }
$

如果通用正则表达式过于笼统,一种更简单的技术是使用多个替换,您可以在其中准确确定您对左大括号之后的空间的重视程度,更具体地说,在右大括号之前:

$ echo '{"Allowed","20863962"}' |
> sed -e 's/{/{ label: /' -e 's/,/, value: /' -e 's/}/ }/'
{ label: "Allowed", value: "20863962" }
$

两者的区别在于替代操作的数量及其复杂性。从某种意义上说,单次替换操作专注于字符串并修复了它们的周围环境;多重替代操作专注于周围环境并进行修复。


我们可以使用它来“拯救”您的代码。请注意,在这种情况下没有理由运行sed两次。

sed -e 's/"A/label: &/' -e 's/"[0-9]/value: &/'

这会找到双引号和 theA并将其替换为,label: "A因为这&意味着“匹配的内容”。与第二次替换类似。这不会在 之后{或之前插入空格},但这可能没问题。

$ echo '{"Allowed","20863962"}' | sed -e 's/"A/label: &/' -e 's/"[0-9]/value: &/'
{label: "Allowed",value: "20863962"}
$

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

于 2013-08-08T05:18:30.400 回答
2
echo '{"Allowed","20863962"}' | sed -e 's/{/{label: /' -e 's/,/, value: /'
于 2013-08-08T05:14:19.520 回答
1

使用 awk:

awk -F "," '{sub(/"/, "label: \"", $1); sub(/"/, "value: \"", $2); print}' OFS=","

输出:

{label: "Allowed",value: "20863962"}
于 2013-08-08T05:16:44.253 回答