$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
。 。次のようにコンソールで手動で試した場合:printf
Dr\^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