shell - 在括号之间添加/修改文本
问题描述
我正在尝试制作分类文本,但我在转动时遇到问题
(class1 (subclass1) (subclass2 item1 item2))
至
(class1 (subclass1 item1) (subclass2 item1 item2))
我不知道在没有缓存的情况下将上面的文本转换为下面的文本subclass1
在内存中。我在 Linux 上使用 Perl,因此欢迎使用任何使用 shell 脚本或 Perl 的解决方案。
编辑:我尝试过使用 grep,将整体保存subclass1
在一个变量中,然后修改并将其导出到列表中;但列表可能会变大,这样会占用大量内存。
解决方案
我不知道把上面的文字变成下面的文字
一般方法:
解析文本。
您似乎有以空格分隔的列表和原子列表。如果是这样,结果可能如下所示:
{ 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', }, ], } ], }
可能会生成更简单的东西,但您对格式的细节很了解。
从树中提取必要的信息。
您对数据格式的详细信息很了解,但如果上述数据结构是由解析器创建的,则可能如下所示:
my $item = $tree->{value}[2]{value}[1]{value};
执行所需的修改。
您对数据格式的详细信息很了解,但如果上述数据结构是由解析器创建的,则可能如下所示:
my $new_atom = { type => 'atom', value => $item }; push @{ $tree->{value}[1]{value} }, $new_atom;
序列化数据结构。
对于上述数据结构,您可以使用以下内容:
sub serialize { my ($node) = @_; return $node->{type} eq 'list' ? "(".join(" ", map { serialize($_) } @{ $node->{value} }).")" : $node->{value}; }
根据具体情况,可能还有其他方法可用。
推荐阅读
- oracle - 是否可以在 Spring Data JPA Repository 的 @Query 注释中使用 Oracle Anonymous Block?
- python - FastAPI & GINO 无法从数据库中的表中获取所有行
- python - 使用last对数据帧进行上采样后如何摆脱NaN?
- ansible - Ansible:如何在 CSV 文件中查找并填充相关文件内容
- qtimer - Qtimer:每 2000 毫秒调用一次不同的插槽
- javascript - 如何在功能组件之间获取道具?
- node.js - 为什么我的护照快递不再起作用了?
- mongodb - 将序列号添加到来自 mongodb 查询的项目
- angular - 如何从另一个项目开始创建一个全新的 Angular 项目?
- java - 在项目中找不到生成的 Javadoc 文件