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" {각 블록의 첫 번째 줄 (선행 공백 참고)을 다음으로 변환합니다.{

관련 정보