【问题标题】:Add/modify text between parentheses在括号之间添加/修改文本
【发布时间】:2019-03-07 03:09:16
【问题描述】:

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

(class1 (subclass1) (subclass2 item1 item2))

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

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

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

【问题讨论】:

  • @JosephSible 编辑了它。
  • 分享您的研究对每个人都有帮助。告诉我们您尝试了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案!另请参阅:How to Ask。前任您的问题没有解释您如何得出需要插入的内容,即为什么需要插入 item1

标签: shell perl text-files


【解决方案1】:

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

一般做法:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2015-05-08
    • 2010-09-27
    • 2013-08-05
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多