在括号之间添加/修改文本

时间:2019-03-07 03:09:17

标签: shell perl text-files

我正在尝试制作分类文本,但在转弯时遇到问题

(class1 (subclass1) (subclass2 item1 item2))

收件人

(class1 (subclass1 item1) (subclass2 item1 item2))

我不知道在不将subclass1缓存在内存中的情况下,将文本从上移到下。我在Linux上使用Perl,因此欢迎使用Shell脚本或Perl的任何解决方案。

编辑:我尝试过使用grep,将整个subclass1保存在变量中,然后进行修改并将其导出到列表中;但列表可能会变大,这样会占用大量内存。

1 个答案:

答案 0 :(得分:2)

  

我不知道将上面的文字变成下面的文字

一般方法:

  1. 解析文本。

    您似乎有用空格分隔的列表和原子的列表。如果是这样,结果可能如下所示:

    {
       type => 'list',
       value => [
          {
             type => 'atom',
             value => 'class1',
          },
          {
             type => 'list',
             value => [
                {
                   type => 'atom',
                   value => 'subclass1',
                },
             ]
          },
          {
             type => 'list',
             value => [
                {
                   type => 'atom',
                   value => 'subclass2',
                },
                {
                   type => 'atom',
                   value => 'item1',
                },
                {
                   type => 'atom',
                   value => 'item2',
                },
             ],
          }
       ],
    }
    

    可能会生成更简单的内容,但是您对格式的细节了解得很少。

  2. 从树中提取必要的信息。

    您了解了有关数据格式的详细信息,但是如果上面的数据结构是由解析器创建的,则它可能像下面这样简单:

    my $item = $tree->{value}[2]{value}[1]{value};
    
  3. 执行所需的修改。

    您了解了有关数据格式的详细信息,但是如果上面的数据结构是由解析器创建的,则它可能像下面这样简单:

    my $new_atom = { type => 'atom', value => $item };
    push @{ $tree->{value}[1]{value} }, $new_atom;
    
  4. 序列化数据结构。

    对于上述数据结构,您可以使用以下内容:

    sub serialize {
       my ($node) = @_;
       return $node->{type} eq 'list'
          ? "(".join(" ", map { serialize($_) } @{ $node->{value} }).")"
          : $node->{value};
    }
    

根据具体情况,还可以使用其他方法。