Sed совпадение между соответствующими скручиваемыми скобками - PullRequest
1 голос
/ 06 ноября 2019

У меня есть следующий файл:

Items{
 Item{
    car "blue"
    tire 4
  }
 Item{
    car "yellow"
    tire 0
 }
}
Orders{
 Order{
    ID 123
    Cost 123
 }
 Order{
    ID 231
    Cost 2
 }
}

И мне нужно в sed , чтобы сопоставить все между элементами {и последним соответствием} этой группы ... как сейчас яможет сделать это с помощью:

sed -n /Items/,/^\}/p

Проблема в том, что файл не чувствителен к пространству, и другие скобки подкатегории могут быть также в начале строки ... любая идея, как универсально соответствоватьЭто ? он должен быть в sed, так как позже мне нужно это «совпадение» для точного редактирования ...

Отредактирован файл примера

1 Ответ

2 голосов
/ 06 ноября 2019

У вас есть несколько вариантов решения проблемы

  1. Преобразование файла в стандартный формат (XML, JSON) и использование стандартных инструментов (xml, xsltproc или jq) для анализа файла.
  2. Довольно распечатать файл, а затем использовать отступ для определения конца блока.
  3. Написать собственный токенизатор и считать открывающие / закрывающие фигурные скобки.

Переходя к # 2, используя perl для создания форматера pretty-print. Извлечь можно с помощью любого инструмента (sed, awk, ...).

perl pp-data.pl filename.txt | sed -n 'sed -n '/^Items/,/^}/p'
#! /usr/bin/perl
# pp-data.pl
use strict ;
my $d = eval { local $/ ; <> } ;
my $l = 0 ;
my $n = 0 ;
while ( $d =~ /({|}|\w+|"[^"]*")/g ) {
        my $w = $1 ;

        $l-- if $w eq '}' ;

        print $n ? " " : (" " x ($l * 2)), $w ;
        $n++ ;

        if ( $w eq "{" ) {
                $l++ ;
                $n = 0 ;
        } elsif ( $w eq "}" ) {
                $n = 0 ;
        } elsif ( $n == 2 ) {
                $n = 0 ;
        } ;
        print "\n" unless $n ;
} ;
1;

Для ввода в ответ анализируемый вывод будет выглядеть так:

Items {
  Item {
    car "blue"
    tire 4
  }
  Item {
    car "yellow"
    tire 0
  }
}
Orders {
  Order {
    ID 123
    Cost 123
  }
  Order {
    ID 231
    Cost 2
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...