문자열에서 특수 문자를 이스케이프하는 방법은 무엇입니까?

$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가 인쇄됩니다. 어휘 포함 : " " … 아무것도 이스케이프되지 않습니다.
  • 그 '는 말 그대로 요점이며, 모든 특수 문자는 특수한 의미가 아닌 문자로 해석됩니다. 차이점을 확인하려면 대신 반향 " 위의 문자열 "을 시도해보세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다