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式は少なくとも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

関連情報