read -r이 텍스트를 먹는 이유는 무엇입니까? [복사]

read -r이 텍스트를 먹는 이유는 무엇입니까? [복사]

names.txt텍스트의 첫 줄이 다음과 같은 파일이 있습니다.

51 Pipe-line\Closed3\00001011_-_Portfolio\UW\Old\NID50_Future_022814.xlsx

새 파일 이름을 쓰고 다음 \으로 바꾸고 싶습니다./

나는 하나를 작성 script.sh하고 sh script.sh. 나의 첫 시도...


while read one two three; do

  new=$(echo $two|tr '\\' '/')
  echo $one
  echo $two
  echo $three
  echo $new

done < ./names.txt

51
Pipe-lineClosed300001011_-_PortfolioUWOldNID50_Future_022814.xlsx

Pipe-lineClosed300001011_-_PortfolioUWOldNID50_Future_022814.xlsx

/숯은 먹었습니다. 통과한 것으로 -r표시되므로 /다음 시도는 다음과 같습니다.

 while read -r one two three; do

  new=$(echo $two|tr '\\' '/')
  echo $one
  echo $two
  echo $three
  echo $new

done < ./names.txt

51
Pipe-line\Closed3

Pipe-line/Closed3

이는 파일 이름의 절반을 차지합니다. 뭐가 문제 야? 어떻게 작동하게 합니까?

답변1

그게 아니라 read저것 echo.

나는 하나를 작성 script.sh하고 sh script.sh.

Debian 및 Ubuntu에서 shis는 dash인수 echo에서 C 스타일 백슬래시 이스케이프를 평가합니다.

$ dash -c 'foo="foo\000bar"; echo "$foo"; printf "%s\n" "$foo"' 
foo
foo\000bar

\000분명히 출력 문자열을 종료하는 NUL 바이트로 변환됩니다 echo. 변수를 인용하는 것은 echo백슬래시를 처리 하는 명령 자체가 실행되기 전에 쉘의 명령줄 처리만 변경하므로 여기서는 도움이 되지 않습니다 .

이는 알려진 이식성 문제이며 여기에 자세히 설명되어 있습니다.왜 printf가 echo보다 나은가요?

예를 들어, echoBash는 인수가 주어지면 백슬래시를 처리합니다 -e.

이 질문은 원래 태그되었습니다.이므로 Bash를 사용하여 스크립트를 실행하려면 bash script.sh대신 run 을 사용하세요 sh script.sh.

답변2

이 작업은 sed를 사용하여 더 간단하고 안정적인 방법으로 수행할 수 있습니다.

sed -i 's|\\|/|g' myfile

다음을 제공합니다:

cat myfile 51 파이프라인/Closed3/00001011__-_Portfolio/UW/Old/NID50_Future_022814.xls

편집하다:

귀하의 의견을 바탕으로 이것이 제가 달성한 방법입니다.

for i in $(cat test | awk '{print $2}')
do
  mv $i `sed 's|\\|/|g' <<< $i`
done

답변3

이것으로 충분합니다:

tr '\\' / < names.txt

관련 정보