首页 > 解决方案 > 在括号之间添加/修改文本

问题描述

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

(class1 (subclass1) (subclass2 item1 item2))

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

我不知道在没有缓存的情况下将上面的文本转换为下面的文本subclass1在内存中。我在 Linux 上使用 Perl,因此欢迎使用任何使用 shell 脚本或 Perl 的解决方案。

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

标签: shellperltext-files

解决方案


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

一般方法:

  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};
    }
    

根据具体情况,可能还有其他方法可用。


推荐阅读