文字列の特殊文字をエスケープする方法は?

文字列の特殊文字をエスケープする方法は?

$fileたとえば、bashDr' A.tifプログラミングで$file一重引用符やその他の特殊文字を削除せずにエスケープする方法は何ですか?

2014年7月9日更新

〜のように@Gillesのリクエスト、次のコードスニペットを処理できませんDr' A.tif

files=$(find /path/ -maxdepth 1 -name "*.[Pp][Dd][Ff]" -o -name "*.[Tt][Ii][Ff]")
echo "${files}" > ${TEMP_FILE}
while read file
do
   newfile=$(echo "${file}" | sed 's, ,\\ ,g') ## line 1
done < ${TEMP_FILE}

試した後@パトリックの答えline 1、それは私に合うようです。しかし、このコマンドは役に立たないようですDr\^s A.tif。 。次のようにコンソールで手動で試した場合:printfDr\^s\ A.tif

printf "%q" "Dr\^s A.tif"

以下の結果が出力されます。

Dr\\\^s\ A.tif

この問題を解決する方法を知っていますか?

答え1

printf組み込みのwithを使用して%qこれを行うことができます。たとえば、

$ file="Dr' A.tif"
$ printf '%q\n' "$file"
Dr\'\ A.tif

$ file=' foo$bar\baz`'
$ printf '%q\n' "$file"
\ foo\$bar\\baz\`

Bashドキュメントからprintf

In addition to the standard format specifications described in printf(1)
and printf(3), printf interprets:

 %b       expand backslash escape sequences in the corresponding argument
 %q       quote the argument in a way that can be reused as shell input
 %(fmt)T  output the date-time string resulting from using FMT as a format
          string for strftime(3)

答え2

努力する:-

file=Dr\'\ A.tif
echo $file
Dr' A.tif

または

file="Dr' A.tif"
echo $file
Dr' A.tif

または、文字列に二重引用符が含まれている場合: -

file='Dr" A.tif'
echo $file
Dr" A.tif

オンラインで脱出と引用のための良いチュートリアルがあります。から始まるこれ

答え3

スクリプトで処理中のファイル名をエスケープする必要はありません。ファイル名が必要な場合のみ言葉あるいは、複数のファイル名を単一の入力ストリームとして別のスクリプトに渡します。

出力を繰り返しているのでfindこれ最も簡単な方法の1つです(!)可能なすべてのパスを処理します。:

while IFS= read -r -d ''
do
    file_namex="$(basename -- "$REPLY"; echo x)"
    file_name="${file_namex%$'\nx'}"
    do_something -- "$file_name"
done < <(find "$some_path" -exec printf '%s\0' {} +)

答え4

これらの回答の多く(使用されたトップ投票回答を含む)は、追加の措置がなければ、すべてのprintf "%q"場合には機能しません。私は以下を提案します(以下の例):

cat <<EOF
2015-11-07T03:34:41Z app[postgres.0000]: [TAG] text-search query doesn't contain lexemes: ""
EOF

関連情報