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
どんな助けでも大歓迎です。
試す
$ 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
はできません)。
私が改行で苦労しているときはいつでも、メイクファイルでespにバックスラッシュを付けると、sedのG
コマンドに到達します。さらに、Posix sed内に留まることができます。
$ sed -e '/[{]/,/[}]/!d' -e '/[}]/G' -e 's|\n|&//end of block matching brace|' myfile.xt
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...
も同様に機能します。