Makefile の複数行 sed

Makefile の複数行 sed

sed使用するものが1つありますMakefile。端末で動作します。コマンドは

sed -n '/[{]/,/[}]/{
p
/[}]/a\
 //end of block matching brace
}' myfile.txt

これにより、次のエラーメッセージが表示されますmake

/bin/sh: 2: Syntax error: Unterminated quoted string

バックスラッシュを追加するか、すべてを1行に入れると、次のような結果が得られます。

sed: -e expression #1, char 14: extra characters after command

どんな助けでも大変感謝します。

答え1

努力する

$ sed -n -e '/[{]/,/[}]/{p; /[}]/ a\ //end of block matching brace' -e' }' file
{sdfg
If I add backslashes or place everything on one line I get
df }
 //end of block matching brace

-e追加されたテキストを終了する必要があるため、2つの(式)オプションが必要です。すべてのsedバージョンで同じ行にテキストを追加することはできません(私のGNUはsed許可しますが、FreeBSDはsed許可しません)。

答え2

makefileの改行、バックスラッシュ(特に)に問題があるたびにGsedのコマンドを使用します。さらに重要なのは、Posix sed内に滞在できることです。

$ sed -e '/[{]/,/[}]/!d' -e '/[}]/G' -e 's|\n|&//end of block matching brace|' myfile.xt

答え3

Gnu makeと許可シェルを使用すると、makeは外部レシピを異なる方法で処理するため、$''中間変数を使用できます。\eol

make  -f - <<\!
define mycmd
sed -n $$'/[{]/,/[}]/{\n\
p\n\
/[}]/a\\\n\
 //end of block matching brace\n\
}' myfile.txt
endef

.PHONY: default
default:
        $(mycmd)
!

各行が\n\追加され、単一行が\2倍になります。 Makeは\eol外部式を空白に変換し、すべてが1行で終わるようにし、シェルは実際の改行に$''変換します。変数の設定に\n使用する必要はありません。同様に動作します。defineMYCMD = sed...

関連情報