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

Shell 在括号之间添加/修改文本,shell,perl,text-files,Shell,Perl,Text Files,我正试着做一篇分类文章,但我在转弯时遇到了问题 (第1类(第1子类)(第2子类第1项第2项)) 到 (第1类(第1子类第1项)(第2子类第1项第2项)) 我不知道如何将上面的文本转换为下面的文本,而不在内存中缓存子类1。我在Linux上使用Perl,所以欢迎使用shell脚本或Perl的任何解决方案 编辑:我尝试过使用grep,将整个子类1保存在一个变量中,然后修改并导出到列表中;但是列表可能会变大,这样会占用大量内存 我不知道如何把上面的文字改成下面的文字 一般做法: 解析文本 您似乎有空

我正试着做一篇分类文章,但我在转弯时遇到了问题

(第1类(第1子类)(第2子类第1项第2项))

(第1类(第1子类第1项)(第2子类第1项第2项))
我不知道如何将上面的文本转换为下面的文本,而不在内存中缓存
子类1
。我在Linux上使用Perl,所以欢迎使用shell脚本或Perl的任何解决方案

编辑:我尝试过使用grep,将整个
子类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',
                },
             ],
          }
       ],
    }
    
    sub serialize {
       my ($node) = @_;
       return $node->{type} eq 'list'
          ? "(".join(" ", map { serialize($_) } @{ $node->{value} }).")"
          : $node->{value};
    }
    
    可能会生成更简单的内容,但您对格式的详细信息了解得很少

  • 从树中提取必要的信息

    您了解了有关数据格式的详细信息,但如果上面的数据结构是由解析器创建的,则可以简单到如下所示:

    my $item = $tree->{value}[2]{value}[1]{value};
    
    my $new_atom = { type => 'atom', value => $item };
    push @{ $tree->{value}[1]{value} }, $new_atom;
    
  • 执行所需的修改

    您了解了有关数据格式的详细信息,但如果上面的数据结构是由解析器创建的,则可以简单到如下所示:

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

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

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

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

    @JosephSible编辑了它。分享你的研究成果对每个人都有帮助。告诉我们您尝试了什么,以及为什么它不能满足您的需求。这表明你花了时间来帮助自己,它使我们避免重复显而易见的答案,最重要的是,它帮助你得到一个更具体和相关的答案!另见:。F.ex。您的问题没有解释您如何推导需要插入的内容,即为什么需要插入
    item1