如何使用grep(或其他LSB工具)计算.po中的空翻译?

Ser*_*ure 6 linux bash grep gettext

我可以使用以下命令在vim中搜索空翻译:

/""\n\n
Run Code Online (Sandbox Code Playgroud)

但我的任务是找到一些非翻译的字符串.任何想法如何使用每个linux盒子应该具有的标准工具(请不要单独的包).

以下是.po文件的示例,其中包含2个已翻译的字符串和2个非翻译字符串(长短变体).

msgid "translated string"
msgstr "some translation"

msgid "non-translated string"
msgstr ""

msgid ""
"Some long translated string which starts from new line "
"and can last for few lines"
msgstr ""
"Translation of some long string which starts from new line "
"and lasts for few lines"

msgid ""
"Some long NON-translated string which starts from new line "
"and can last for few lines"
msgstr ""
Run Code Online (Sandbox Code Playgroud)

Ste*_*eve 6

这是使用的一种方式awk:

awk '$NF == "msgstr \"\"" { c++ } END { print c }' FS="\n" RS= file
Run Code Online (Sandbox Code Playgroud)

结果:

2
Run Code Online (Sandbox Code Playgroud)

说明:

放入awk段落模式.然后测试每个块中的最后一行.如果最后一行与模式完全匹配,请对其进行计数.然后,在脚本的末尾打印出计数.如果您以后决定要计算已翻译字符串的数量,只需更改==!=.HTH.


从下面的注释中,处理包含空格的空行:

您需要使用正则表达式,例如:( RS="\n{2,}|\n([ \t]*\n)+|\n$"这可能会简化).但是,应该注意的是,成为正则表达式能力RS是一种GNU awk扩展.其他awk人将无法以某种方式处理多字符记录分隔符.幸运的是,上述文件格式看起来相当严格,因此不需要处理包含空格的行.

如果面对包括空格的分隔符,快速修复是对以下内容的调用sed:

< file sed 's/^ *$//' | awk ...
Run Code Online (Sandbox Code Playgroud)


mr.*_*tic 5

我建议使用可用的gettext工具,而不是尝试.po直接解析文件:

$ msggrep -v -T -e "." test.po 
msgid "non-translated string"
msgstr ""

msgid ""
"Some long NON-translated string which starts from new line and can last for "
"few lines"
msgstr ""
Run Code Online (Sandbox Code Playgroud)

msggrep标志是:

  • -v 反转匹配
  • -T 应用下一个模式 msgstr
  • -e 搜索模式

即显示任何msgstr不匹配的/./,因此是空的。

由于msggrep没有-c,单行中的计数是:

 msggrep -v -T -e "." test.po  | grep -c ^msgstr
Run Code Online (Sandbox Code Playgroud)

(自 2002 年 1 月 v0.11 以来msggrep一直是gettext包的一部分。LSB 核心又名 ISO/IEC 23360-1:2006(E) 只强制要求gettextmsgfmt二进制文件,但我还没有看到没有它的系统,所以它应该希望能满足你的要求。)