我的 Ubuntu 机器上有多个文档,其中引用了多本圣经书籍和经文。我想创建一个列表,显示书名章节号和一节或多节经文。文档中的典型条目是Matt 12:1
或John 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)。
简而言之,该文件被slurp
ed(一次全部读入)和(破坏性地)split
在“ .
”句点空间上,以将文本分成句子。这些元素存储在@a
数组中。在第二个语句中,@a
对数组进行match
es 到"(" ~ ")" .+?
正则表达式的测试,这是 Raku 查找带括号的文本的方式("(" .+? ")"
正则表达式也有效,但请参阅有关的说明嵌套结构)。这些匹配项被join
ed(实质上删除空白元素)并分配给数组@b
。
在第三个语句中,括号内的文本再次(破坏性地)split
,这次是\,\s*
逗号后跟可选空白,或者是使用…标记创建并由或组成的<[()]>
自定义字符类。请注意,在本例中使用 ,它会删除空白元素。这些结果被分配回数组(是 的语法糖)。<[
]>
(
)
split(… , :skip-empty)
.=
@b
@b.=split(…)
@b = @b.split(…)
最后在第四条语句中,map(*.tc)
的元素@b
被转换为标题大小写,Bag
-ged(参见这里),并由(递减值)sort
编辑-*.value
。输出是使用.say for
…逐行产生的。
交换键和值以及切换输出列(以及排序顺序)非常容易。将结尾更改.say
为从输出中.put
删除箭头,留下由制表符空格分隔的两列。=>
\t