0

次の形式の C++ ソース コードで xgettext によって生成された .pot ファイルがあります。

#: file1.cpp:line
#: file2.cpp:line
msgid "" - empty string

#: file1.cpp:line
#: file2.cpp:line
msgid " \t\n\r" - string contains only spaces

#: file1.cpp:line
#: file2.cpp:line
msgid "real text"

次に、次のようなコマンドを使用します。

grep "#: " "$(POT_FILE)" | sed -e 's/^\(#: \)\(.*)/\2'

出力に含まれるファイル名と行のみを持つようにします。

しかし、問題は、スペースのみを含む文字列用のファイルは必要ないということです。

一連の行 #: blablabla のすぐ隣に msgid "" などの行を見つけなければならず、文字列の内容に応じて先行するすべての行をバイパスする必要があるため、非常に複雑です。

そのようなコマンドを手伝ってくれる人はいますか?

ありがとう!

4

1 に答える 1

0

私が正しく理解している場合は、次を実行可能ファイルに入れます。

#!/usr/bin/awk -f

BEGIN { FS="\"" } # make it easier to test the text for msgid

# clean "file:line" line and store it in an array called "a"
/^#: / { sub(/^#: /, "", $0); a[i++]=$0 }

/^msgid/ {
    if( valid_msgid() ) { for( j in a ) print a[j] }
    reset() # clear array a after every msgid encountered
    }

function reset() {
    for( j in a ) { delete a[j]  }
    i = 0
    }

# put your validity tests here.
# $2 won't contain the entire string if the gettext contains double quotes
function valid_msgid() {
    if( length($2) > 0 && $2 !~ /^ / ) return 1
    return 0
    }

上記をというファイルに入れて実行するawkoと、次のようになります。chmod +x awkoawko data.pot

#: file1.cpp:line
#: file2.cpp:line

「行」の値を数値に変換すると、最後のセクションと一致します。

トリックの 1 つは"、区切り記号として使用することです。msgid に が含まれる行を拒否する必要がある場合は"、より複雑な解析を使用して完全なメッセージ テキストを特定する必要があります。

私は xgettext にアクセスできないので-、例の悪い行の後のコメントがあなたからのものなのかプログラムからのものなのかわかりません。xgettext プログラムはそれらを出力します。デリミタを に変更し" -て、これらの文字列を でテストできますvalid_msgid()

于 2014-01-23T16:38:09.483 に答える