-1

重複の可能性:
UNIXシェルスクリプトとAWKスクリプトの引用符のエスケープ

内部にnawkブロックがあるUNIXスクリプトがあります(これはUNIXおよびNAWKスクリプトの一部です。さらに多くのロジックがあり、以下のコードは間違いなくnawkにあるはずです)国ISOコードのルックアップ値を読み取るこのブロック国と国コードの値を持つファイルから、国名()または単一のアポストロープに括弧がある場合は常に問題に直面します'

これらは単なるサンプル値であり、一重引用符と括弧を使用して多くの国を含めることができます

Sample values

CIV@COTE D'IVOIRE
COD@CONGO, Democratic Republic of (was Zaire)
HRV@CROATIA (local name: Hrvatska) 

文字列に一重引用符または括弧がある場合のこれらの2つの問題を克服するのに役立ちますか?

とにかく、この一重引用符とアポストロフィを動的にエスケープできますか?

コード

processbody() {

nawk '{

           // These are sample values not exhaustive
           COUNTRY_NAME = "COTE D'IVOIRE" // this is read dynamically inside nawk
           #COUNTRY_NAME = "CONGO, Democratic Republic of (was Zaire)"  // this is read dynamically inside nawk
           #COUNTRY_NAME = "CROATIA (local name: Hrvatska)"  // this is read dynamically inside nawk
            if (COUNTRY_NAME != " "){

                           file = "/tmp/country_codes.txt"
                          FS = "@"
                          while( getline < file ) {
                          if( $0 ~ COUNTRY_NAME ) {
                          COUNTRY_CODE = $1
                           }
                           }
                           close( file )



            }

 printf("%s\n",COUNTRY_CODE) > "/tmp/code.txt"

  }' /tmp/file.txt
  }

  processbody
4

1 に答える 1

1

いくつかの問題があります。一重引用符で囲まれた文字列 (nawk 本体) 内に一重引用符をハードコーディングし、~文字列の比較ではなく、正規表現の一致を行う演算子を使用しているという事実。

「これはnawk内で動的に読み取られる」とはどういう意味ですか? あなたの例では、値をハードコーディングしています。ファイルから読み込んでいますか?

一重引用符で囲まれた文字列内で一重引用符を取得するには、いくつかの方法があります。

  1. バックスラッシュで一重引用符をエスケープします。nawk '... x="what\'s up" ...'
  2. シェル文字列連結:nawk '...x="what'"'"'s up" ...'
  3. ヒアドキュメントを使用します。

.

nawk_script=<<'END'
{ 
  x="what's up" 
  ...
}
END
nawk "$nawk_script" /tmp/file.txt

括弧の問題に関しては、正規表現一致演算子の代わりに単純に文字列比較関数を使用してください。

if (index($0, COUNTRY_NAME) > 0) {
  ...
}
于 2011-07-19T12:06:48.490 に答える