手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

exstr(1)

名称

exstr - 从源文件中提取字符串

用法概要

exstr filename...
exstr -e filename...
exstr -r [-d] filename...

描述

exstr 实用程序用于从 C 语言源文件中提取字符串,并将其替换为对消息检索函数的调用(请参见 gettxt(3C))。此实用程序将提取所有括在双引号中的字符串,而不仅仅是用作 printf 命令或 printf 例程的参数。在第一种格式中,exstr 在源文件中查找到所有字符串并将其写入标准输出。每个字符串均以源文件名和冒号 (:) 开头。

第一步即使用 exstr –e 提取一列字符串并将其保存在文件中。下一步,检查此列表,确定可以进行转换并随后由消息检索函数来检索的字符串。然后,通过删除不能转换的行修改此文件,对于可以进行转换的行,通过将消息文件名和消息编号添加为行中的第四个 (msgfile) 和第五个 (msgnum) 条目来修改此文件。指定的消息文件必须已经由 mkmsgs(1) 创建,并存在于 /usr/lib/locale/locale/LC_MESSAGES 中。(目录 locale 与编写文本字符串所用的语言相对应;请参见 setlocale(3C))。所使用的消息编号必须与消息文件中字符串的序列号相对应。

现在,将此修改后的文件用作 exstr –r 的输入,生成原始 C 语言源文件的新版本,该版本中的字符串已替换为对消息检索函数 gettxt() 的调用。msgfilemsgnum 字段用于构造 gettxt() 的第一个参数。如果消息检索在运行时失败,则将显示 gettxt() 的第二个参数。除非使用 –d 选项,否则此参数将为空字符串。

此实用程序并不是在所有情况下均可替换字符串。例如,静态初始化的字符串无法由函数调用替换。第二个例子是,以转义序列格式出现的字符串可能无法转换。为了不破坏现有代码,必须检查通过调用 exstr –e 创建的文件,并且删除包含无法由函数调用替换的字符串的行。代码在某些情况下需要修改,以便可提取字符串并将其替换为对消息检索函数的调用。

选项

支持以下选项:

–e

从指定的 C 语言源文件中提取字符串列表,并附有位置信息。此列表在标准输出中按以下格式生成:

file:line:position:msgfile:msgnum:string

其中

file

C 语言源文件的名称

line

文件中的行号

position

行中的字符位置

msgfile

null

msgnum

null

string

提取的文本字符串

通常,您会将此输出重定向到文件中。然后,您将编辑此文件来添加要用于 msgfilemsgnum 的值:

msgfile

此文件包含将替换 string 的文本字符串。具有此名称的文件必须通过 mkmsgs(1) 实用程序在适当的位置进行创建和安装。

msgnum

msgfile 中字符串的序列号。

下一步使用 exstr –r 替换 file 中的 string

–r

通过对消息检索函数 gettxt() 的调用来替换 C 语言源文件中的字符串。

–d

此选项与 –r 选项结合使用。如果在运行时调用 gettxt() 后消息检索失败,则将显示提取的字符串。您将在需要运行于国际化环境中并以多种语言显示消息的应用程序上,使用由 exstr 提供的功能。exstr 通过指向消息数据库中相应字符串的函数调用来替换文本字符串。使用的数据库取决于 LC_MESSAGES 环境变量的运行时值(请参见 environ(5))。

示例

示例 1 以下示例说明了 exstr 的使用情况

假设文件 example.c 包含两个字符串:

main()

{

        printf("This is an example\n");

        printf("Hello world!\n");

}

通过参数 example.c 调用的 exstr 实用程序从指定的文件中提取字符串并将其显示在标准输出中。

example% exstr example.c

生成以下输出:

example.c:This is an example\n
example.c:Hello world!\n

exstr 实用程序由 –e 选项和参数 example.c 进行调用,并将输出重定向至文件 example.stringsout

example% exstr -e example.c > example.stringsout

在文件 example.stringsout 中生成以下输出

example.c:3:8:::This is an example\n
example.c:4:8:::Hello world!\n

在这些字符串可替换为对检索函数的调用之前,必须编辑 example.stringsout,以添加要用于 msgfilemsgnum 字段的值。如果 UX 是消息文件的名称,12 表示文件中字符串的序列号,则添加此消息后 example.stringsout 将类似于以下内容:

example.c:3:8:UX:1:This is an example\n
example.c:4:8:UX:2:Hello world!\n

现在,可以使用 –r 选项调用 exstr 实用程序,以便通过对消息检索函数 gettxt() 的调用来替换源文件中的字符串。

example% exstr -r example.c <example.stringsout >intlexample.c

生成以下输出:

extern char *gettxt();

main()

{

	printf(gettxt("UX:1", ""));

	printf(gettxt("UX:2", ""));

}

以下示例:

example% exstr -rd example.c <example.stringsout >intlexample.c

将提取的字符串用作 gettxt() 的第二个参数:

extern char *gettxt();

main()

{

        printf(gettxt("UX:1", "This is an example\n"));

        printf(gettxt("UX:2", "Hello world!\n"));

}

文件

/usr/lib/locale/locale/LC_MESSAGES/*

mkmsgs(1) 创建的文件

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
text/locale

另请参见

gettxt(1)mkmsgs(1)printf(1)srchtxt(1)gettxt(3C)printf(3C)setlocale(3C)attributes(5)environ(5)

诊断

exstr 生成的错误消息是不需要加以说明的。这些错误消息表示命令行中出现的错误或输入文件中遇到的格式错误。