我正在尝试运行以下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
命令,第二部分将被视为文件名。
发生这种情况是因为命令替换(反引号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