6

次のようなコマンドを使用して、vim で空の翻訳の検索を実行できます。

/""\n\n

しかし、私の仕事は、翻訳されていない文字列の数を見つけることです。すべてのLinuxボックスに必要な標準ツールを使用してこれを行う方法のアイデア(個別のパッケージはありません)。

以下は、2 つの翻訳済み文字列と 2 つの未翻訳文字列 (長いバージョンと短いバージョン) を含む .po ファイルの例です。

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 ""
4

5 に答える 5

7

を使用する 1 つの方法を次に示しawkます。

awk '$NF == "msgstr \"\"" { c++ } END { print c }' FS="\n" RS= file

結果:

2

説明:

段落awkモードにします。次に、各ブロックの最後の行をテストします。最後の行がパターンと正確に一致する場合は、それを数えます。次に、スクリプトの最後でカウントを出力します。後で翻訳された文字列の数をカウントすることにした場合は、単純に に変更==!=ます。HTH。


以下のコメントから、空白を含む空行を処理するには:

次のような正規表現を使用する必要がありますRS="\n{2,}|\n([ \t]*\n)+|\n$"(これはおそらく簡略化できます)。ただし、が正規表現になる機能は拡張機能RSGNU awkあることに注意してください。他awkの は、何らかの方法で複数文字のレコード セパレータを処理できません。幸いなことに、上記のファイル形式はかなり固定されているように見えるため、空白を含む行を処理する必要はありません。

空白を含むセパレーターに直面した場合、クイックフィックスは次の呼び出しsedです。

< file sed 's/^ *$//' | awk ...
于 2013-02-10T14:57:58.770 に答える
6

ファイルを直接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 ""

msggrepフラグは次のとおりです。

  • -v反転一致
  • -T次のパターンを適用msgstr
  • -e検索パターン

つまり、msgstr一致しないものを表示する/./ため、空になります。

msggrepがないため、-cワンライナーのカウントは次のとおりです。

 msggrep -v -T -e "." test.po  | grep -c ^msgstr

(は 2002 年 1 月のv0.11 以降msggrepのパッケージの一部です。LSBコア別名 ISO/IEC 23360-1:2006(E) はおよびバイナリのみを義務付けていますが、それがないシステムはまだ見たことがありません。うまくいけば、あなたの要件を満たしています。)gettextgettextmsgfmt

于 2013-02-13T16:47:46.307 に答える
2

awk(素敵な)解決策はすでに与えられているので、他に4つ方法があります:

すべてのコマンドは、サンプルと適切な.poファイルでテストされました。

使用するsed

sed -ne '/msgstr ""/{N;s/\n$//p}' <poFile | wc -l
2

説明: を見つけるたびにmsgstr ""、次の行をマージします。文字列の最後の文字として改行を抑制することができれば、s/\n$//それらを出力しますp。最後に行数を数えます。

バッシュのみ

bash 以外のバイナリを使用しない場合:

total=0
while read line;do
    if [ "$line" == 'msgstr ""' ] ;then
        read line
        [ -z "$line" ] && ((total++))
      fi
  done <poFile
echo $total
2

説明: が見つかるたびにmsgstr ""次の行を読み、空の場合はカウンターをインクリメントします。

その他の bash の方法
mapfile -t line <poFile
count=0
for ((i=${#line[@]};i--;));do
    [ -z "${line[i]}" ] && [ "${line[i-1]}" == 'msgstr ""' ] && ((count++))
  done
echo $count
2

説明:.poファイル全体を 1 つの配列で読み取り、配列を参照して前のフィールドに が含まれている空のフィールドを探しmsgstr ""、カウンターをインクリメントして、印刷します。

Perl (コマンド ライン モード)

perl -ne '$t++if/^$/&&$l=~/msgstr\s""\s*$/;$l=$_;END{printf"%d\n",$t}' <poFile
2

説明: 空の行と前の行 ( variable に格納されている$l)を見つけるたびにmsgstr ""、カウンターをインクリメントします。

ダッシュ(バッシュではありません!)

count=0
while read line ; do
    [ "$line" = "" ] && [ "$prev" = 'msgstr ""' ] && true $((count=count+1))
    prev="$line"
  done <poFile
echo $count
2

perlサンプルに基づいて、これは

于 2013-02-13T14:45:27.720 に答える
1

試す:

grep -c '^""$'

内容が 2 つのみの行をカウントします。

編集:

あなたのコメントに続いて、上記はあなたのニーズを満たしていないことがわかります. 複数行の一致を実行するには、次の方法で GNU grep を使用できます。

grep -Pzo '^msgstr ""\n\n' en.po | grep -c msgstr

これはテスト済みで、GNU grep 2.14 を使用して動作することがわかっています。ただし、GNU grep が標準で十分かどうかはわかりません。

最初の grep の説明:

-PPerl 正規表現拡張機能を有効にします。

-z行末の改行をヌルに置き換えて、grep が改行を追跡できるようにします。

-o'only-matching' を出力-zします。使用中のため必要です。それ以外の場合は、ファイル全体を印刷します。

2 番目の grep の説明:

-c一致する行数をカウントします。この場合はmsgstrです。と一緒に使用すると 1 が返されるため、これは別のgrepステートメントにする必要があります。-c-z

于 2013-01-25T14:50:53.643 に答える
-1
grep -n ^msg your.po | grep -v '""' | uniq -D -f1

これは で始まる行を探し、空の文字列 ( )msgだけの行を無視し、 を使用して重複する行を探します ( /フィールドを無視します)。""uniqmsgidmsgstr

CUPS ファイルからの出力例:

$ grep -n ^msg /usr/share/locale/es/cups_es.po | grep -v '""' | uniq -D -f1
3742:msgid "ParamCustominCutInterval"
3743:msgstr "ParamCustominCutInterval"
3745:msgid "ParamCustominTearInterval"
3746:msgstr "ParamCustominTearInterval"
3858:msgid "Quarto"
3859:msgstr "Quarto"
3967:msgid "Stylus Color Series"
3968:msgstr "Stylus Color Series"
3970:msgid "Stylus Photo Series"
3971:msgstr "Stylus Photo Series"
3973:msgid "Super A"
3974:msgstr "Super A"
于 2013-01-25T14:52:07.003 に答える