sed - 我如何匹配这个模式?

sed - 我如何匹配这个模式?

我正在使用 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" {(注意前导空格)转换为{

相关内容