You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:48:17