Re: ディレクトリ内ファイル一括置換
shirai@unixusers.net (Takashi SHIRAI) writes:
> 先生方にも筆の誤り?
>
> >> mkdir tmp
> >> for i in *.F
> >> do
> >> sed 's/include \'\(.*\)\'/#include "\1"/' $i >tmp/$i
> >> done
>
> 普通の shell だと「'」を含むような文字列は "" で quote し
> た方が記述し易いと思います。
" で quote する場合、* も quote が必要なんで、
> sed "s/include '\(.*\)'/#include \"\1\"/" $i >tmp/$i
sed "s/include '\(.\*\)'/#include \"\1\"/" $i >tmp/$i
でしょうか。
私は、
sed "s/include '\([^']+\)'/#include "'"\1"' $i >tmp/$i
あたりがおすすめかな。
> それだと「'」→「"」の変換が出来ませんから、s function を
> もう一つ書かなくては。
> sed "/^include /s/^/#/;s/'/\"/g" $i >tmp/$i
sed "/^include /s/^/#/;t;s/'/\"/g" $i >tmp/$i
sed "s/^include /#include /;t;s/'/\"/g" $i >tmp/$i
のどっちでも同じだと思いますが、/^include /と一致しなかった
場合は t で最後まで吹っ飛ばす必要がありますよね。
もしくは、
> or
> sed -e "/^include /{" -e "s/^/#/" -e "s/'/\"/g" -e "}" $i >tmp/$i
と同じように、{ でブロック化して、
sed "/^include /{s/^/#/;s/'/\"/g}" $i >tmp/$i
とか。
> sed の実装により文法が微妙に異なるので、このうちどちらが有
> 効かは環境依存ですが、場合によってはどちらも通らないかも知れ
> ません。
そうなんですか?
そんなに色んな環境で sed をこねくりまわした経験はありません
が、どちらもまっとうな使いかたのような気がしますが。
上の例で ; をコマンドの区切りに使うというのはちょっとイレギュ
ラーだから拡張された sed だとだめかも知れませんが、sed って
知らないコマンドがきたら改行と同じように区切り文字だと思って
くれるってのは昔っからの仕様だったような気がしますので、大抵
はうまくいくと思います。
-e は一行で記述するときに改行みたいな役割をするための昔っか
らあるオプションだからこちらも問題ないかと。
ブロック化の { も昔っからあると思いますし。
環境依存でだめな場合の sed ってどんなものがあるんでしょうう?
知ってたら教えてください。
--
01/31 02:14頃
水戸
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735