다음 명령을 실행하려고 합니다 sed
.
sed 's?^?'`pwd`'/VOCdevkit/VOC2012/JPEGImages/?; s?$?.jpg?' test.txt > voc.2012.test
그러나 오류 메시지로 응답합니다.
sed: -e expression #1, char 37: unterminated `s' command
이 오류의 원인은 무엇입니까? 이를 수정하려면 어떻게 해야 합니까?
답변1
출력에 pwd
공백이나 기타 공백 문자가 포함되어 있으면 sed
표현식이 최소한 두 부분으로 분할됩니다. 첫 번째 부분은 불완전한 s
명령이고 두 번째 부분은 파일 이름으로 처리됩니다.
이는 명령 대체(backticks pwd
)가 인용되지 않았기 때문에 발생합니다. 즉, 이런 일이 발생합니다.외부작은따옴표 또는 큰따옴표.
이 문제를 해결하려면 명령 대체를 큰따옴표로 묶으십시오.
sed 's?^?'"$(pwd)"'/VOCdevkit/VOC2012/JPEGImages/?; s?$?.jpg?' test.txt
이 변수를 사용하도록 선택할 수도 있습니다 $PWD
.
sed 's?^?'"$PWD"'/VOCdevkit/VOC2012/JPEGImages/?; s?$?.jpg?' test.txt
그러나 파일의 각 줄 앞에 경로 이름을 붙이고 파일 이름 접미사를 파일에 추가하는 것처럼 보입니다.
다음 방법을 사용하면 더욱 안전하게 이 작업을 수행할 수 있습니다 awk
.
awk '{ printf("%s/VOCdevkit/VOC2012/JPEGImages/%s.jpg\n", ENVIRON["PWD"], $0) }' test.txt
이는 포함, 공백 또는 문자열에서 읽은 행이 $PWD
정규식으로 해석될 수 있는 경우에도 작동합니다.test.txt
?
시험:
$ pwd
/tmp/shell-yash.Oeo3joN3
$ cat test.txt
hello world
sunny afternoon
bumbling bees
$ awk '{ printf("%s/VOCdevkit/VOC2012/JPEGImages/%s.jpg\n", ENVIRON["PWD"], $0) }' test.txt
/tmp/shell-yash.Oeo3joN3/VOCdevkit/VOC2012/JPEGImages/hello world.jpg
/tmp/shell-yash.Oeo3joN3/VOCdevkit/VOC2012/JPEGImages/sunny afternoon.jpg
/tmp/shell-yash.Oeo3joN3/VOCdevkit/VOC2012/JPEGImages/bumbling bees.jpg