sed로 교체할 때 "종료되지 않은 's' 명령" 발생 [닫기]

sed로 교체할 때 "종료되지 않은 's' 명령" 발생 [닫기]

다음 명령을 실행하려고 합니다 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

관련 정보