我正在使用 sed,但无法找出如何从每个块中删除一些第一行文本。这是我的原始数据:
"s220823vaps2512": {
"hostname": "s220823vaps2512",
"description": data",
"type": "Virtual",
"os": "data",
"idc": "data",
"environment": "data",
"deviceclass": "data",
"cores": "data",
"memory": "data",
"frontnet": "data",
"ipset": {
"backnet": "data",
"storagenet": "data",
"metroclusternet": "data"
},
"roles": "data",
"mounts": "data"
},
"s220823vaps2513": {
"hostname": "s220823vaps2513",
"description": "data",
"type": "Virtual",
"os": "data",
"idc": "data",
"environment": "data",
"deviceclass": "data",
"cores": "data",
"memory": "data",
"frontnet": "data",
"ipset": {
"backnet": "data",
"storagenet": "data",
"metroclusternet": "data"
},
我想使用 sed 成功删除{
每个块第一行之前的所有内容,留下类似于
{
"hostname": "data",
"etc": "etc",
},
{
"hostname": "data",
"etc": "etc",
},
答案1
这个答案是基于上面看起来很像 JSON,所以我因此假设它可能是 JSON
。但它在你的样本中不完整,我也认为这是一个错字。如果情况并非如此……那么,您已经有了sed
答案。
请 - 不要使用正则表达式来解析JSON
。太恶心了。正则表达式不擅长递归标记数据类型,例如JSON
/ XML
。这充其量只是一个肮脏的黑客行为,会在未来创建脆弱的代码。
同样 -JSON
完整很重要 - 我必须猜测你的完整JSON
外观。
假设JSON
这样(使用http://jsonlint.com/整理元素)
{
"s220823vaps2512": {
"hostname": "s220823vaps2512",
"description": "data",
"type": "Virtual",
"os": "data",
"idc": "data",
"environment": "data",
"deviceclass": "data",
"cores": "data",
"memory": "data",
"frontnet": "data",
"ipset": {
"backnet": "data",
"storagenet": "data",
"metroclusternet": "data"
},
"roles": "data",
"mounts": "data"
},
"s220823vaps2513": {
"hostname": "s220823vaps2513",
"description": "data",
"type": "Virtual",
"os": "data",
"idc": "data",
"environment": "data",
"deviceclass": "data",
"cores": "data",
"memory": "data",
"frontnet": "data",
"ipset": {
"backnet": "data",
"storagenet": "data",
"metroclusternet": "data"
}
}
}
然后就是获取你想要的位的方法:
#!/usr/bin/env perl
use strict;
use warnings;
use JSON;
my $input = ### as above, snipped for brevity.
#decode/validated
my $json = decode_json ( $input );
#create new JSON array of elements.
my $new_json = [map { $json -> {$_} } keys %$json];
#print it out.
print to_json ( $new_json, { pretty => 1, canonical => 1 } );
通过这种方式,您可以创建有效的 JSON 输出,并处理诸如键顺序不同的情况(这在 JSON 中完全有效)。
答案2
简单sed
:
sed 's/^[^{]*{/{/' file
- 仅搜索以非
{
(^[^{]
) 字符开头的行,零次或多次*
后跟{
. - 这一切都被一个单一的
{
.
编辑:如果您想排除某些模式被替换(例如行"ipset":
),请使用以下命令:
sed '/"ipset":/n;s/^[^{]*{/{/' file
- 如果该行以 开头
"ipset":
,则继续下一行n
。
答案3
这似乎有效,至少对于您提供的数据样本而言:
sed -'s/^ .*{/{/' file
它将每个块的第一行"name" {
(注意前导空格)转换为{