【发布时间】:2016-05-10 08:55:44
【问题描述】:
我有一个简单的 perl 脚本,它按照以下几行进行大量文本替换:
#!/usr/bin/perl
{
open(my $in, "<", "Texts.txt") or die "No input: $!";
open(my $out, ">", "TeXed/Texts.tex") or die "No output directory: $!";
LINE: while (<$in>) {
s/(txt@)(.*)(?<!\t|\[)\[(.*)/\1\2\\ovl{}\3/g;#
# there are a bunch of other replacements like the above
print $out $_ ;
}
}
到目前为止一切顺利。我正在运行此脚本的文本被组织成块(并不总是相同的长度)。每个块都以相同的标识符 (txt@) 开头,然后是唯一的标签。每个标签都以 # 开头。
我想要实现的是删除所有重复的标签 - 基本上我只想保留标签的每个第一个实例并替换/删除所有后续实例,直到标签更改。在下面的示例中,要替换/删除的是 bold。
txt@#Label1 一些文字
更多文字
还有一些文字
txt@#Label1 一些其他文本
更多文字
更多文字
还有一些文字
txt@#Label1 一些随机文本
更多文字
还有一些文字
txt@#Label2 一些文字
更多文字
更多文字
还有一些文字
txt@#Label1 一些文字
更多文字
还有一些文字
txt@#Label3 一些文字
更多文字
还有一些文字
txt@#Label3 一些文字
更多文字
还有一些文字
txt@#Label1 一些文字
更多文字
还有一些文字
等等
对不起,这个例子太长了——我想不出更好的方法来解释这一点。
所以我想删除所有重复的 Label1、Label2 等,但不修改同一行和后续行的其余文本(一些文本,一些文本)。后续行的数量并不总是相同的(因此不是每个第 n 行都必须替换)。
perl 有可能吗?还是有什么其他方式? (我没有嫁给 perl,如果用另一种语言更容易的话,我很乐意尝试——我不是程序员,尽管如此详细的说明将不胜感激)。
【问题讨论】:
-
是否也要保留文本?你想如何组织输出?
-
是的,其余的文字必须保留(我只是编辑了帖子以使其更清晰)。输出应保持其组织方式,我在文本上运行了许多其他替换操作,但没有删除任何行。
-
好的。所以带有重复标签的行只是字面上失去了标签,其他一切都保持不变?
-
确实有效!!!太好了,非常感谢您的及时解决! -- 还有一件事:我也想去掉标签(这是标签的一部分)。
-
已修复。由于没有任何东西依赖于该正则表达式(除了删除),因此只需将
#移动到非捕获组中即可。然后替换不把它放回去。如果有更多消息,请告诉我。