我正在尝试在文本文档中搜索书籍和诗句

我正在尝试在文本文档中搜索书籍和诗句

我的 Ubuntu 机器上有多个文档,其中引用了多本圣经书籍和经文。我想创建一个列表,显示书名章节号和一节或多节经文。文档中的典型条目是Matt 12:1John 9: 4-9

如果可能的话,该列表应包含Matt 12:1页码以及在文档中找到它的次数。我有一个脚本,用于创建一个包含所有单词列表的 txt 文件。我以前从未使用过,grep所以我完全迷失了。

这是我为单词列表所做的工作:

cat exported.txt | grep -o -E '\w+' | tr '[A-Z]' '[a-z]' | sort | uniq -c >preconcordance.txt

带有几个示例的片段:

圣经表明是耶路撒冷的子民(约翰福音 6:43-47,赛 54:11, 13),而这些儿子事奉上帝(玛 3:17-18)。这两座城市是那些遭受永火之死的人所遭遇的例子。彼得写道:彼后 2:6 ……深渊是所有恶魔中最邪恶的人被监禁的地方(彼后 2:4,犹大书 1:6,启示录 9:1)。关于这个禁锢之地的进一步解释,请参阅路加福音 8:31,并注意基督有能力将这些恶魔送到无底深渊。

编辑

重新表述我的问题:是否可以在括号中查找文本和数字。如果我所有的书名章节和诗句参考文献都包含为(2Pet 1:2-3).我见过一些类似的例子,但无法使它们发挥作用。此时完全不在我的范围之内。

答案1

使用(以前称为 Perl_6)

raku -e 'my @a = slurp.split(". "); my @b = @a.match(:global, / "(" ~ ")" .+? / ).join;  \
         @b.=split(/ \,\s* || <[()]> /, :skip-empty); .say for @b.map(*.tc).Bag.sort(-*.value);' 

示例输入(注意OP的第一个参考文献已被复制并小写):

The Scriptures reveal it's the sons of Jerusalem (John 6:43-47, Isa 54:11, 13), (john 6:43-47), and it's these sons who serve God (Mal 3:17-18). and These two cities are examples of what happens to those who suffer death by eternal fire. Peter wrote: 2Pet 2:6 .. The ABYSS is where the most wicked of all demons are imprisoned (2Pet 2:4, Jude 1:6, Rev 9:1). For a further explanation of this place of restraint, see Luke 8:31, and note that Christ had the power to send these demons to the ABYSS.

示例输出:

John 6:43-47 => 2
Jude 1:6 => 1
Rev 9:1 => 1
Isa 54:11 => 1
Mal 3:17-18 => 1
13 => 1
2Pet 2:4 => 1

Raku 是 Perl 编程语言家族的一员,在这里它是一个不错的选择 - 特别是如果您预计要处理 Unicode 文本,例如希腊语或希腊语希伯来语字符(Raku 默认处理 Unicode)。

简而言之,该文件被slurped(一次全部读入)和(破坏性地)split在“ .”句点空间上,以将文本分成句子。这些元素存储在@a数组中。在第二个语句中,@a对数组进行matches 到"(" ~ ")" .+?正则表达式的测试,这是 Raku 查找带括号的文本的方式("(" .+? ")"正则表达式也有效,但请参阅有关的说明嵌套结构)。这些匹配项被joined(实质上删除空白元素)并分配给数组@b

在第三个语句中,括号内的文本再次(破坏性地)split,这次是\,\s*逗号后跟可选空白,或者是使用…标记创建并由或组成的<[()]>自定义字符类。请注意,在本例中使用 ,它会删除空白元素。这些结果被分配回数组(是 的语法糖)。<[]>()split(… , :skip-empty).=@b@b.=split(…)@b = @b.split(…)

最后在第四条语句中,map(*.tc)的元素@b被转换为标题大小写,Bag -ged(参见这里),并由(递减值)sort编辑-*.value。输出是使用.say for…逐行产生的。

交换键和值以及切换输出列(以及排序顺序)非常容易。将结尾更改.say为从输出中.put删除箭头,留下由制表符空格分隔的两列。=>\t

https://raku.org

相关内容