web-dev-qa-db-ja.com

Makefileの複数行sed

sedコマンドを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

どんな助けでも大歓迎です。

6
Theo

試す

$ 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

追加テキストを終了する必要があるため、必要な2つの-e(式)オプションに注意してください。すべてのsedバージョンで同じ行にテキストを追加できるわけではありません(my GNU sedはできますが、私のFreeBSD sedはできません)。

3
RudiC

私が改行で苦労しているときはいつでも、メイクファイルでespにバックスラッシュを付けると、sedのGコマンドに到達します。さらに、Posix sed内に留まることができます。

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

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を実際の改行に変換します。変数を設定するためにdefineを使用する必要はありません。 MYCMD = sed...も同様に機能します。

1
meuh