シェルコマンドの gawk 変数エスケープ

シェルコマンドの gawk 変数エスケープ

使用する小さなgawkスクリプトを実行しようとしていますsystem()。ファイルのリストを取得し、find次のようにスクリプトを実行したいと思います。

find <arguments> -printf "%f\n" | script.awk

問題は、これらのファイルにスペース、引用符、角かっこなどの特殊文字が含まれていることです。たとえば、

$ ls
'Aujourd'\''hui C'\''est Toi (Orchestral).flac'

私は次のような様々な参考資料を試しました。

system("<command> \""$0"\"")

これ:

system("<command> \'"$0"\'")

あらゆる種類のエラーが発生します。一部は でsh -c、 一部はgawk... で発生します。

$0これらの問題に直面せずに、gawkスクリプトのレコードやその他の変数をシェルコマンドに渡す方法はありますか?

メモ:一時的にファイル名を変更する方が簡単かもしれませんが、これを避けるのは難しいことがわかりました。

編集する:

提案された答えのどれも私の問題を解決しないので、問題のより具体的な説明は次のとおりです。以下を使用してコマンドを実行しようとします。2奇妙な変数。例:

私が実行した場合:

system("metaflac --show-tag=ARTIST \""FILE"\"")

引用したためエラーが発生せず、FILE二重引用符が含まれていないため、すべてがうまく機能します。

しかし、私が実行した場合:

system("metaflac --set-tag=ARTIST="AWK_VAR_WITH_ARTIST_VALUE" "\"FILE\")

参照してもmetaflacflacファイルが見つからないとエラーが表示されます。エラーメッセージを読み取ると、ファイル名が別々の単語で区切られていることがわかります。

ベストアンサー1

system("<command> \"$0\"")これをプロセスに書き込むawkの機能に置き換えることができますprint $0 | "pre;<command> \"$v\""今後部分はstdinをシェル変数vとして読み込みます。 Bashでは次のようになりますread -r v

awk 'BEGIN{ cmd="read -r v; ls -ld \"$v\"" }
     { print $0 | cmd; close(cmd); }'

ファイル名の改行などの恐ろしいことを処理するには、findでprint0パスを使用するか、awkがそれを許可する場合はRS='\0'bashを使用できます。

find . -print0 |
awk -v RS='\0' '
 BEGIN{ cmd="read -r -d \"\" v; ls -ld \"$v\"" }
 { print $0 "\x00" | cmd; close(cmd); }'

おすすめ記事