我从这个开始:
{"Allowed","20863962"}
并想插入标签:和值:所以它看起来像这样:
{ label: "Allowed", value: "20863962" }
我尝试使用 sed,但它进行了替换,而不是插入。
echo "{"Allowed","20863962"}" | sed 's/A/label: /' | sed 's/[0-9]/value: /'
输出
{label: llowed,value: 0863962}
你得到了你想要的,但这不是你想要的。
首先,输出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"}
$
如果我使用这种格式,我会省略冒号后的空格,但这就是我......
echo '{"Allowed","20863962"}' | sed -e 's/{/{label: /' -e 's/,/, value: /'
使用 awk:
awk -F "," '{sub(/"/, "label: \"", $1); sub(/"/, "value: \"", $2); print}' OFS=","
输出:
{label: "Allowed",value: "20863962"}