Shell sed(1):预加一行

Shell sed(1):预加一行,shell,scripting,sed,Shell,Scripting,Sed,我在文件中有以下文本结构: "require": { "php": ">=5.3.3", "symfony/symfony": "2.1.*", "jms/di-extra-bundle": "1.1.*" }, 我想补充一点 ,“friendsofsymfony/用户包”:“*” 在“}”之前,使用sed(1) 我还必须考虑到最后一行的结尾可能有逗号,也可能没有逗号 我尝试了很多东西 sed '/require/,/\},/ { /[^,]$/ i//&

我在文件中有以下文本结构:

"require": {
    "php": ">=5.3.3",
    "symfony/symfony": "2.1.*",
    "jms/di-extra-bundle": "1.1.*"
},
我想补充一点

,“friendsofsymfony/用户包”:“*”

在“}”之前,使用sed(1)

我还必须考虑到最后一行的结尾可能有逗号,也可能没有逗号

我尝试了很多东西

sed '/require/,/\},/ { /[^,]$/ i//&,\n        '\'something\''/ }' composer.json;
但我不能让它工作


非常感谢您的帮助。

使用
i
命令插入。要插入的字符串末尾需要换行符:

sed '/require/,/},/{/^},/i, "friendsofsymfony/user-bundle": "*"
}'

使用
i
命令插入。要插入的字符串末尾需要换行符:

sed '/require/,/},/{/^},/i, "friendsofsymfony/user-bundle": "*"
}'

使用sed很难实现这一点,您应该使用适当的JSON库

但要使用GNU sed实现您想要的功能,您可以执行以下操作(此处不检查结尾逗号):

要检查结尾逗号,您需要进行更多分析:

解析

/^[\t]*“当找到'require'时要求/{#”
:a
两两穿行
/\n[\t]*\},/!{P;s/[^\n]+\n//;ba}行,直到找到“}”
/,\n/!s/\n/,&/#如果不存在,则附加逗号
s/\n([\t]*)},/\n\1\1“friendsofsymfony\/用户包”:“\*”&/
}
运行时使用:

sed -rf parse.sed infile
在提供的示例文件上运行parse.sed时的输出摘录:

[…]
“要求”:{
“php”:“>=5.3.3”,
“symfony/symfony”:“2.2.*”,

“条令/orm”:“>=2.2.3,使用sed很难稳健地实现这一点,您应该使用适当的JSON库

但要使用GNU sed实现您想要的功能,您可以执行以下操作(此处不检查结尾逗号):

要检查结尾逗号,您需要进行更多分析:

解析

/^[\t]*“当找到'require'时要求/{#”
:a
两两穿行
/\n[\t]*\},/!{P;s/[^\n]+\n//;ba}行,直到找到“}”
/,\n/!s/\n/,&/#如果不存在,则附加逗号
s/\n([\t]*)},/\n\1\1“friendsofsymfony\/用户包”:“\*”&/
}
运行时使用:

sed -rf parse.sed infile
在提供的示例文件上运行parse.sed时的输出摘录:

[…]
“要求”:{
“php”:“>=5.3.3”,
“symfony/symfony”:“2.2.*”,

“条令/orm”:“>=2.2.3,您需要使用sed吗?一般来说,解码JSON、添加密钥并重新编码(例如使用PHP)可能更安全。也许使用PHP脚本更容易做到这一点?我的主要目标是调用某种脚本来编辑此文件(添加JSON元素)。您需要使用sed吗?一般来说,解码JSON、添加密钥并重新编码(例如使用PHP)可能更安全。也许使用PHP脚本更容易做到这一点?我的主要目标是调用某种脚本来编辑此文件(添加JSON元素)。这对我不起作用。请在此文件上尝试:@Tool:您必须包含缩进:
/require/,/},/{/^*},/i
某些sed实现需要在
i
之后换行。这对我不起作用。在这个文件上试试:@Tool:您必须包括缩进:
/require/,/},/{/^*},/i
sed的一些实现需要在
i
后面加一个换行符。