次のコマンドを実行しようとします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
式は少なくとも2つの部分に分割されます。最初の部分は不完全なs
コマンドで、2番目の部分はファイル名として扱われます。
これは、コマンドオーバーライド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