用 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命令,第二部分将被视为文件名。

发生这种情况是因为命令替换(反引号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

相关内容