シェルスクリプトで外国語をgrepできません。

シェルスクリプトで外国語をgrepできません。

私はシェルスクリプトに初めてアクセスし、次の形式のテキストを含むテキストを持っています。

"some foreign language",'corresponding ID to text'

たとえば:-

"Назад",IDC_SSB_DLG_BACK_BTN

IDに関連するテキストを見つけてテキストファイルとして保存する必要があります。

私のサンプルスクリプトは次のとおりです。

#!/bin/sh
target_file=$1
output=$2
translationID=IDC_SSB_DLG_BACK_BTN
translation=$(cat $target_file | grep $translationID)
translationValue=$(echo "$translation" | awk -F',' '{print $1}')
translationValueFinal=$(echo "$translationValue" | tr -d '"')
echo "$translationValueFinal" >> $output

このスクリプトの実行中にエラーが発生しました -grep: (standard input): binary file matches

シェルスクリプトで外国語をgrepして保存する方法を提案してください。ありがとう

答え1

GNU grepを使用している場合は、どの文字がgrepに表示されても入力をテキストとして処理するように指示できます。

grep -a

ただし、入力にテキスト以外のバイトが含まれているように見えるので、入力ファイルを確認することをお勧めします。

答え2

grep特定のフィールドでリテラル文字列の一致を実行したいので、これには多くの追加コードを使用しないでください。 grepはそれ自体ではこれを行うことができず、それを実行できるツールは他のツールの助けを必要としません。 。

既存のコマンド:

translationID=IDC_SSB_DLG_BACK_BTN
grep $translationID

追加しても行方"不明grep "$translationID"次のいずれかの条件が該当する場合は失敗します。

  1. 最初のフィールドの文字列はIDと一致します(たとえばIDC_SSB_DLG_BACK_BTN,any、または
  2. 各フィールドの文字列には、IDがその文字列の部分文字列(たとえば、any,FOOIDC_SSB_DLG_BACK_BTNBARまたは)である一意の文字列が含まれていますFOOIDC_SSB_DLG_BACK_BTNBAR,any
  3. any,foo.barとにany,foodbar一致する正規表現メタ文字を含む2番目のフィールドの文字列とID変数translationID=foo.bar

他の人もいるかもしれません。バラよりパターンに一致するテキストを見つける方法このタイプの質問に関する追加情報。

たとえば、次の入力ファイルを使用します。

$ cat file
any1,foodbar
foo.bar,any2
foofoo.barbar,any3
any4,foofoo.barbar
"Назад",foo.bar

2番目のフィールドが文字列foo.bar(つまり、上記の最後の行)の場合は、最初のフィールドの値を印刷しようとします。

$ translationID=foo.bar

grep以下は、予想される行を見つけましたが、間違った一致をたくさん作成して不要な行を出力するコマンドです。

$ grep "$translationID" file
any1,foodbar
foo.bar,any2
foofoo.barbar,any3
any4,foofoo.barbar
"Назад",foo.bar

このawkコマンドを使用すると、正しい行のみが一致し、必須フィールドのみが出力されます。

$ awk -F',' -v id="$translationID" '$2==id{print $1}' file
"Назад"

または、引用符を削除する場合は、次のようなさまざまなオプションがあります。

$ awk -F'[,"]+' -v id="$translationID" '$3==id{print $2}' file
Назад

awkコマンドはターゲットフィールドの完全なフィールドリテラル*文字列比較を実行するので正確ですが、grepコマンドは部分行正規表現比較を実行し、入力値が幸運でない場合は時々失敗します。

*マイナーな警告 -translationID文字通り処理するバックスラッシュが含まれている場合は、次のことを行う必要があります。

$ id="$translationID" awk -F',' '$2==ENVIRON["id"]{print $1}' file
"Назад"

または同様の選択肢を参照してください。awkスクリプトでシェル変数を使用する方法

入力ファイルにNUL文字を含めることができる場合は、GNU awkまたは他のawkを使用してサポートしている内容を文書化してください。 awkはテキスト処理ツールなので、テキストファイルのみを入力として使用する必要があり、POSIX定義によると、テキストファイルにNUL文字を含めることはできません。 UL文字とGNU awkを使用して設定する必要があるかもしれません。ゲストモード、例えば:

awk -v BINMODE=3 -F',' -v id="$translationID" '$2==id{print $1}' file

関連情報