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