システムがawkでcpを呼び出すように渡された変数からスペースなどをエスケープする方法

システムがawkでcpを呼び出すように渡された変数からスペースなどをエスケープする方法

この問題には、単純なエスケープ文字を難しくするのに十分な複雑さがあります。私はbashスクリプトを持っており、そのほとんどにはセミコロンで区切られたファイルを読み取るawkスクリプトが含まれています。このテキストファイルのフィールドの1つは、一部のJPEGへのディレクトリパスです。 JPEGを別の場所にコピーしたいのですが、元のディレクトリパスにスペースがあります(そして破損を引き起こす可能性がある他の文字列もあるかもしれません)。問題のディレクトリを一重引用符で囲むことはできません。なぜなら、awkインタプリタが停止し、二重引用符を使用すると、awkのリテラル文字列に変換されるからです。

gawk 4.1.1を使用しています。私が達成しようとしているタスクのいくつかのawkコードは次のとおりです。

imageDirectory = $1;
cpJpegVariable="cp -r " imageDirectory " assets";
#screws up if imageDirectory has spaces and other naughty characters
system(cpJpegVariable);

ベストアンサー1

あなたはそれを使用することができます:

awk '...
    cpJpegVariable="cp -r '\''" imageDirectory "'\'' assets";
    ...'

'エスケープは必須ではありませんが、awkシェル'\''エスケープは必須です。)したがって、awk変数が展開されるとcpJpegVariable次のようになります。

cp -r 'file_contain space' assets

これにより、'自分以外のすべての特殊文字に関する問題を回避できます。一重引用符文字を含めることができる場合は、imageDirectoryエスケープ文字を使用できますgsub()。例:

awk '{gsub("'\''","'\''\"'\''\"",imageDirectory)}1'

おすすめ記事