$file
에 파일 이름 값이 있다고 가정하면 Dr" A.tif
. Bash 프로그래밍에서 특수 문자를 제거하지 않고 $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}
iv line 1
의 id = “e667cae277″>
@Patrick 의 답변은 저에게 맞는 것 같습니다.하지만 Dr\^s A.tif
, printf
명령이 도움이되지 않는 것 같습니다. Dr\^s\ A.tif
가 표시됩니다. 다음과 같이 콘솔에서 수동으로 시도하면 :
printf "%q" "Dr\^s A.tif"
다음과 같은 출력이 표시됩니다.
Dr\\\^s\ A.tif
이 문제를 처리하는 방법이 있습니까?
댓글
- $ file을 사용할 예정입니까? 아니면 특수 문자가있는 문자열을 $ file에 할당하는 문제입니까?
- 실제로 find 명령은 파일 목록 배열을 반환합니다. 그런 다음이 파일 목록을 $ file 변수로 반복합니다.
- 당신 ' 여기에 몇 가지 정답이 주어졌지만 아마도 그들은 ' 정말 물어 보는 질문입니다. 여기에있는 귀하의 의견을 보면 ' 잘못된 길을 가고있는 것 같습니다. 코드를 계속 표시하지 않으시므로 '별로 도움을 드릴 수 없습니다. 그러나 왜 내 셸 스크립트가 공백이나 기타 특수 문자로 인해 질식합니까? 를 배경으로 읽는 것이 좋습니다. 대본을 보여주고 원하는 작업을 설명하세요.
답변
나 이를 위해 %q
에 내장 된 printf
를 사용할 수 있습니다. 예 :
$ file="Dr" A.tif" $ printf "%q\n" "$file" Dr\"\ A.tif $ file=" foo$bar\baz`" $ printf "%q\n" "$file" \ foo\$bar\\baz\`
printf
의 Bash 문서에서 :
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)
댓글
- ' 특정 사례에서 작동하지 않습니다. 큰 따옴표를 보존해야 할 때.
- @ user3467349 따옴표를 사용하면 잘 작동합니다. 저는 ' 당신에게 '
printf '%s' "foo"
와 같은 것을 시도하고 있습니다. 먼저 쉘에서 인수 구문 분석이 작동하는 방식을 이해해야합니다. gnu.org/software/bash/manual/bash.html#Shell-Operation # 2는 # 6 이전에 발생합니다. -
printf
및 다른 조작없이 인쇄 된이 문자열의 예를 제공합니다.It doesn't have a: ""
- 귀하의 문제는
printf
. 문제는 ' 셸이 문자열을 구문 분석하는 것을 원하지 않는다는 것입니다. 이렇게하려면 입력을 구문 분석하지 않는 방식으로 ' 셸에 입력을 전달해야합니다. 이를 수행하는 한 가지 방법은read -r -p 'input: ' && printf '%q\n' "$REPLY"
이며 메시지가 표시되면 입력을 제공하는 것입니다. - '가 말한대로 지금 여러 번. 원시 데이터를 셸에 전달하는 방법을 모르는 것은 '
printf
의 문제가 아닙니다. 문제와 관련이없는 해결책을 비판하기보다는 질문을해야 할 수도 있습니다.
답변
시도 :-
file=Dr\"\ A.tif echo $file Dr" A.tif
또는
file="Dr" A.tif" echo $file Dr" A.tif
또는 문자열에 double이 포함 된 경우 quote :-
file="Dr" A.tif" echo $file Dr" A.tif
넷에서 이스케이프 및 인용에 대한 좋은 자습서가 있습니다. 이 항목 으로 시작합니다.
답변
“스크립트에서 처리중인 파일 이름을 이스케이프 할 필요가 없습니다. 스크립트에 파일 이름을 리터럴 으로 입력하거나 여러 파일 이름을 단일 파일로 전달하려는 경우에만 이스케이프가 필요합니다. 입력 스트림을 다른 스크립트로 전송합니다.
find
의 출력을 반복하므로 이
a>는 가능한 모든 경로를 처리하는 가장 간단한 방법 (!) 중 하나입니다 :
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" {} +)
답변
빠르고 (매우) 더럽습니다
find . | sed "s/^/"/" | sed "s/$/"/"
답변
printf "%q"
를 사용하여 가장 많이 득표 한 답변을 포함한 많은 답변은 추가 조작없이 모든 경우에 작동하지 않습니다.다음을 제안합니다 (아래 예).
cat <<EOF; 2015-11-07T03:34:41Z app[postgres.0000]: [TAG] text-search query doesn"t contain lexemes: "" EOF
댓글
- n00b 질문을 실례합니다.하지만 실제로 이것을 사용하여 문자열의 문자를 이스케이프하는 방법에 대해 자세히 설명해 주시겠습니까? 작성한 코드를 터미널에 복사하면 2015-11-07T03 : 34 : 41Z app [postgres.0000] : [TAG] text-search query does ' t가 인쇄됩니다. 어휘 포함 : " " … 아무것도 이스케이프되지 않습니다.
- 그 '는 말 그대로 요점이며, 모든 특수 문자는 특수한 의미가 아닌 문자로 해석됩니다. 차이점을 확인하려면 대신 반향 " 위의 문자열 "을 시도해보세요.