![sed로 교체할 때 "종료되지 않은 's' 명령" 발생 [닫기]](https://linux55.com/image/149695/sed%EB%A1%9C%20%EA%B5%90%EC%B2%B4%ED%95%A0%20%EB%95%8C%20%22%EC%A2%85%EB%A3%8C%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20's'%20%EB%AA%85%EB%A0%B9%22%20%EB%B0%9C%EC%83%9D%20%5B%EB%8B%AB%EA%B8%B0%5D.png)
다음 명령을 실행하려고 합니다 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