$file
예를 들어 bash Dr' 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
,이것가장 간단한 방법 중 하나입니다(!)가능한 모든 경로를 처리합니다.:
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