私はシェルスクリプトに初めてアクセスし、次の形式のテキストを含むテキストを持っています。
"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"
次のいずれかの条件が該当する場合は失敗します。
- 最初のフィールドの文字列はIDと一致します(たとえば
IDC_SSB_DLG_BACK_BTN,any
、または - 各フィールドの文字列には、IDがその文字列の部分文字列(たとえば、
any,FOOIDC_SSB_DLG_BACK_BTNBAR
または)である一意の文字列が含まれていますFOOIDC_SSB_DLG_BACK_BTNBAR,any
。 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