2017-04-02 1 views
2

最初に、潜在的に重複する質問に対するお詫び。私はスクリプティングを新しくしているので、検索するキーワードを見つけることさえできません。ことで、私はできる限り問題の説明を簡素化することを試みた:awk、gsub、アンパサンドと予想外の拡張

私はこれだけの行を含むテキストファイル(test.txtという)があります。

REPLACE 

を私は、次のコマンドを実行しましたファイルのテキスト(すなわち、)をコード変数値if (A & B)で置き換えると仮定します。

if (A & B) 

実際の出力は何とかアンパサンドがgsub正規表現のパラメータである、 'REPLACE' に展開されています:

私は code変数の値であるとして印刷されることを期待

code="if (A & B)" ; awk -v var="${code}" '{ gsub(/REPLACE/, var); print }' test.txt 

の予想される出力

if (A REPLACE B) 

おそらく私はアンプをエスケープする必要があります幸いなことに、code変数の人口は私のコントロールから外れているので、私はその値を手動で操作することはできません。

ありがとう:バージョンのawk FYI

は、 "1.1(GNU MPFR 3.1.5、GNU MP 6.1.2)GNU Awkの4.1.4、API" です!

+1

'&'「代替を意味し、完全一致 "を含む、awk regexesで。あなたはそれをエスケープする必要があります: 'code =" if(A \\&B) "'(シェルが拡張もしているので、2つのbaclossがあります) – grochmal

答えて

2

&は、多くのツールで後方参照メタ文字であり、「あなたが検索した正規表現に一致する文字列」を意味します。リテラル文字列を使用しようとするなら、正規表現と後方参照の代わりにリテラル文字列を使用してください。

例:

code="if (A & B)" 
awk -v old="REPLACE" -v new="$code" 's=index($0,old){$0=substr($0,1,s-1) new substr($0,s+length(old))} 1' test.txt 

代わり、正規表現や交換をsantizeしようと、心の弱い人のためではない、一般的になりやすい、複雑とエラーになり、次を参照してください。Is it possible to escape regex metacharacters reliably with sed

+1

ありがとう、エド!あなたが提供した例は完全に機能します。 – Remon

+1

hah!待つ必要はありません。覚えてありがとう;) – Remon

+1

こんにちはエド、このコードは私を助けてくれました。アンパサンドなので、gsubを使ってawkでテンプレートエンジンを実装するのに困っていました。私はそれを無効にする方法があったと思う。しかし、あなたのソリューションは夢のように機能しました。ありがとう! – valrog