msgexec
是 GNU gettext 工具集的一部分,用于对消息目录中的每个翻译条目依次执行指定命令。该工具的核心功能是将每个翻译条目作为独立输入传递给外部程序或内置命令进行处理,并汇总所有命令的输出与返回码。适用于批量处理翻译条目(如提取特定字段、格式转换或自定义逻辑处理)。
核心功能
- 逐条目执行命令
对.po
文件中的每个翻译条目调用一次指定命令,支持外部程序或内置命令(如0
)。 - 输出聚合
合并所有命令的输出,并返回最大返回码作为整体结果。 - 格式兼容性
支持 Java.properties
和 NeXTstep/GNUstep.strings
格式。 - 内置命令支持
提供内置命令0
,将翻译条目以空字符分隔输出,便于与xargs -0
等工具结合使用。
语法
bash
msgexec [OPTION] COMMAND [COMMAND-OPTION]
选项详解
命令输入控制
选项 | 说明 |
---|---|
--newline |
在输入末尾添加换行符。适用于需要行结束符的命令处理。 |
输入文件位置
选项 | 说明 |
---|---|
-i, --input=INPUTFILE |
指定输入的 PO 文件路径。若未指定或为 - ,则从标准输入读取。 |
-D, --directory=DIRECTORY |
将 DIRECTORY 添加到输入文件搜索路径中。 |
输入文件语法
选项 | 说明 |
---|---|
-P, --properties-input |
输入文件为 Java .properties 格式。 |
--stringtable-input |
输入文件为 NeXTstep/GNUstep .strings 格式。 |
信息性输出
选项 | 说明 |
---|---|
-h, --help |
显示帮助信息并退出。 |
-V, --version |
输出版本信息并退出。 |
命令参数
-
COMMAND
要执行的命令名称。可以是外部程序(如
grep
、awk
)或内置命令(如0
)。- 内置命令
0
:输出翻译条目后附加空字符(\0
),适用于xargs -0
的输入格式。
示例:msgexec 0 input.po | xargs -0 echo
。
- 内置命令
-
[COMMAND-OPTION]
传递给命令的参数列表。例如:
msgexec grep "example" input.po
。
使用场景与示例
1. 使用内置命令 0
处理翻译条目
bash
msgexec 0 input.po | xargs -0 -n 1 echo
- 将每个翻译条目作为独立输入传递给
echo
,通过xargs -0
实现无换行符分隔的批量处理。
2. 提取所有翻译的 msgstr
字段
bash
msgexec awk '/^msgstr/{print $0}' input.po
- 使用
awk
提取每个翻译条目中的msgstr
行。
3. 处理 Java .properties
文件
bash
msgexec -P cut -d'=' -f1 input.properties
- 对
.properties
文件中的每个键值对提取键名(cut -d'=' -f1
)。
4. 批量验证翻译完整性
bash
msgexec -i input.po sh -c 'test "$1" != "$2" || echo "Untranslated"'
- 检查每个翻译条目是否与
msgid
相同,若相同则输出 "Untranslated"。
5. 添加换行符以适配特定命令
bash
msgexec --newline sed 's/old/new/' input.po
- 对每个翻译条目执行
sed
替换操作,并确保输入末尾有换行符。
注意事项
- 命令兼容性
- 确保
COMMAND
能正确读取标准输入并处理单个翻译条目。 - 内置命令
0
的空字符分隔格式需与下游工具(如xargs -0
)匹配。
- 确保
- 返回码处理
msgexec
返回所有命令调用中的最大返回码,非零值表示失败。
- 性能影响
- 每个翻译条目触发一次命令调用,大规模文件可能导致性能下降。
- 编码兼容性
- 默认编码为当前系统本地编码(
locale
),必要时结合msgconv
转换编码。
- 默认编码为当前系统本地编码(
- 调试建议
- 使用
--newline
避免因缺少换行符导致命令解析错误。
- 使用