如何在Bash中查询LibreOffice同义词典文本并实现行合并
Bash查询LibreOffice同义词典实现方案
需求背景
需要编写纯Bash环境下运行的脚本,查询LibreOffice同义词典的文本导出版本:输入查询词后,输出所有关联的相关词汇。
前期准备命令
首先下载并提取同义词典为纯文本文件:
# 下载LibreOffice词典及同义词典扩展包 wget "https://extensions.libreoffice.org/assets/downloads/41/1653961771/dict-en-20220601_lo.oxt" # 将同义词典内容提取为名为lo的纯文本文件 unzip -p dict-en-20220601_lo.oxt th_en_US_v2.dat > lo
文件格式说明
提取后的词典文件格式特征非常明确:
- 词条行不以
(开头,格式为词条名|对应释义组数 - 每个词条下的词性、同义词行均以
(开头,归属于上一个词条,直到下一个不以(开头的新词条行出现
文件内容片段示例:
nine|3 (adj)|9|ix|cardinal (similar term) (noun)|9|IX|niner|Nina from Carolina|ennead|digit (generic term)|figure (generic term) (noun)|baseball club|ball club|club|baseball team (generic term) nine-banded armadillo|1 (noun)|peba|Texas armadillo|Dasypus novemcinctus|armadillo (generic term)
预期输出
查询词为nine时,需要过滤掉词性标记、括号内的分类标注,逐行输出所有关联词汇:
9 ix cardinal 9 IX niner Nina from Carolina ennead digit figure baseball club ball club club baseball team
实现代码
不需要提前做行合并操作,利用awk的状态标记能力可以直接流式处理文件,一步输出结果。
将以下内容保存为thesaurus.sh:
#!/bin/bash QUERY="$1" awk -v search_term="$QUERY" ' # 匹配到词条行 /^[^(]/ { split($0, term_arr, "|") # 比对词条名和查询词,控制输出开关 print_flag = (term_arr[1] == search_term) ? 1 : 0 next } # 输出开关打开时,处理当前行的同义词 print_flag { # 切掉开头的(词性)前缀 sub(/^\([^)]*\)\|/, "") # 按|切分所有词汇 word_count = split($0, word_list, "|") for (i=1; i<=word_count; i++) { # 切掉词汇末尾括号里的标注内容 sub(/ *\(.*\)$/, "", word_list[i]) print word_list[i] } } ' lo
给脚本添加执行权限后即可调用:
chmod +x thesaurus.sh ./thesaurus.sh nine
执行后输出内容和预期格式完全一致。
如果不想单独存脚本,也可以直接在命令行执行单行命令,把nine替换为需要查询的词即可:
awk -v q="nine" '/^[^(]/{split($0,a,"|");f=(a[1]==q)?1:0;next} f{sub(/^\([^)]*\)\|/,"");n=split($0,w,"|");for(i=1;i<=n;i++){sub(/ *\(.*\)$/,"",w[i]);print w[i]}}' lo
内容的提问来源于stack exchange,提问作者Taylan Morcol
相关产品推荐
相关产品推荐

