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
  • {^[^{])以外の文字で0回以上開始し、*後に続く行のみを検索します{
  • それはすべて一つの{

編集する:特定のパターン(lineなど)を置き換えから除外するには、"ipset":次のようにします。

sed '/"ipset":/n;s/^[^{]*{/{/' file
  • 行がで始まる場合は、"ipset":次の行に進みますn

答え3

少なくとも提供されたデータサンプルではこれが機能しているようです。

sed -'s/^ .*{/{/' file 

"name" {各ブロックの最初の行(先行スペースを参照)を次に変換します。{

関連情報