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에서 sh
is는 dash
인수 echo
에서 C 스타일 백슬래시 이스케이프를 평가합니다.
$ dash -c 'foo="foo\000bar"; echo "$foo"; printf "%s\n" "$foo"'
foo
foo\000bar
\000
분명히 출력 문자열을 종료하는 NUL 바이트로 변환됩니다 echo
. 변수를 인용하는 것은 echo
백슬래시를 처리 하는 명령 자체가 실행되기 전에 쉘의 명령줄 처리만 변경하므로 여기서는 도움이 되지 않습니다 .
이는 알려진 이식성 문제이며 여기에 자세히 설명되어 있습니다.왜 printf가 echo보다 나은가요?
예를 들어, echo
Bash는 인수가 주어지면 백슬래시를 처리합니다 -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