Apache http serverでmod_sedを利用して出力HTMLに行を追加したいと思います。
ところが文法チェックでエラーになります。
回避方法などご存知ありませんでしょうか。
こんなconfigurationを書いてみました
HOGEHOGEの行の後にFUGAFUGAと一行いれたい。
apache
1OutputSed '/^HOGEHOGE$/aFUGAFUGA'
ところが、apachectl -tで文法チェックすると以下のエラー。
# /usr/local/apache2/bin/apachectl -t AH00526: Syntax error on line 80 of /usr/local/apache2/conf/httpd.conf: Failed to compile sed expression. command garbled: a/^HOGEHOGE$/aFUGAFUGA
他コマンドだと
アドレス表現がおかしいのかなと、dコマンドで試してみたところ、これは正常に動作(HOGEHOGEの行が削除される)。
OutputSed '/^HOGEHOGE$/d'
sed自体でも試してみたんですが、これはちゃんと動作する(HOGEHOGEの次の行にFUGAFUGAの行が挿入される)。
# sed -e '/^HOGEHOGE$/aFUGAFUGA' filename
iコマンドでも同様のエラーです。cやyは試していません。
補足情報
apache2.4.41。
mod_sedのソースもちらっとのぞいてみましたが、aコマンドに対応するソースもあるので、aやiがインプリされてないってことはないと思うんだけど。
'/^HOGEHOGE$/a FUGAFUGA'
はどうでしょうか。
'/^HOGEHOGE$/a FUGAFUGA' とか
'/^HOGEHOGE$/a\ FUGAFUGA' も試したんですが、どちらも
Failed to compile sed expression. command garbled:
と言われちゃいます。
いまのところ、
s/^HOGEHOGE$/&FUGAFUGA
でしのいでます。&のあとに改行をいれたいんですが、\nって書くとそのまま表示されちゃう。
これは別の課題。
まじめにソースを読んでみました。エラーチェックしているのは modules/filters/sed0.cの365行目〜376行目。
case 'a':
commands->rep->command = ACOM;
if (commands->rep->ad2) {
command_errf(commands, SEDERR_AD1MES, commands->linebuf);
return -1;
}
if (*commands->cp == '\\')
commands->cp++;
if (*commands->cp++ != '\n') {
command_errf(commands, SEDERR_CGMES, commands->linebuf);
return -1;
}
アドレス指定のあとにコマンド"a"があった時、次の文字が'\'だったら、ポインタを一個進めて、さらに次が`\n`じゃないとエラーだと。
gnu sedのman pageにあるaコマンドの文法は確かに、
a \
text
ってなってるので、その通り。でも、Apacheの設定ファイル中でそんな表現できるのかなぁ。
設定ファイルにバックスラッシュを書くと自動的に\\に補正されちゃうし、改行をいれるとエラーになっちゃうし。
こんなふうに書いてもエラーだと怒られる。
OutputSed '/^HOGEHOGE$/a\'
OutputSed 'HOGEHOGE'
当然ながらこんなふうに書いてもエラー。
OutputSed '/^HOGEHOGE$/a\
HOGEHOGE'
ちなみに、上記のエラーチェック部分をまるごとコメントアウトしてmakeすると期待どおりの動作(HOGEHOGEの行の後にFUGAFUGAという行が挿入される)を得ることができました。
それともApacheの設定ファイル上で単独文字で改行ってなにか表現方法があるんでしょうか。
>改行をいれたいんですが、\nって書くとそのまま表示されちゃう。これは別の課題。
とありますが、apache経由ならブラウザで見る訳ですよね?
<br>とかタグで表示すればいいのではないでしょうか。
あーそうじゃないです。HTMLで改行を表現したいんじゃなくて、HTMLコード中に改行をいれたいんです。
↑了解しました。
あなたの回答
tips
プレビュー