1

UNIXシェルスクリプトでAWKを使用して、ファイル内の1つのパターンのインスタンスを別のパターンに置き換えて、新しいファイルに出力しようとしています。

具体的には、ファイル名がMYFILE.pcの場合、「g_MYFILE」(引用符なし)を含む「*MYFILE」のインスタンスを探しています。このために、私はgsubAWKの関数を使用しています。

出力ファイルが正常に書き出され、必要に応じてすべてのインスタンスが置き換えられましたが、スクリプトは「MYFILE」(つまり星なし)のインスタンスも「g_MYFILE」に置き換えています。

スクリプトは次のとおりです。

awk -v MODNAM=${OUTPUT_FILE%.pc} '
{
    gsub("\*"MODNAM, "g_" MODNAM);      
    print 
}' ${INPUT_FILE} > ${FULL_OUTPUT_FILENAME}

スクリプトを明確にするために、次の変換を実行します。

  • '* MYFILE'->'g_MYFILE'
  • 'MYFILE'->'g_MYFILE'

最初の変換のみを実行したい。誰か提案はありますか?

4

3 に答える 3

2

*の最初の引数として正規表現定数の代わりに動的正規表現を使用しているため、をダブルエスケープする必要がある場合がありますgsub。詳細については、GAWKマニュアルのセクション3.8を参照してください。

awk -v MODNAM=${OUTPUT_FILE%.pc} '
{
    gsub("\\*"MODNAM, "g_" MODNAM);      
    print 
}' ${INPUT_FILE} > ${FULL_OUTPUT_FILENAME}
于 2011-11-10T09:32:04.513 に答える
1

あなたのコードは実際に私のmawk1.3.3とzshシェルで動作します。これはシェルエスケープの問題である可能性があります-awkスクリプトをファイルに書き込んで、それを経由して呼び出すことを試みました-fか?

于 2011-11-10T09:19:59.303 に答える
1

単純な置換の場合、awkはまったく必要ありません。試す:

/home/sirch> file="*a*a*a"
/home/sirch> echo ${file//\*/g_}
g_ag_ag_a
于 2011-11-10T09:29:21.003 に答える