Re: ディレクトリ内ファイル一括置換
しらいです。
In article <bvdn39$g0l$1@newsserv.ics.es.osaka-u.ac.jp>,
SAITOH akinori <saitoh@ist.osaka-u.ac.jp> wrote:
>大阪大学の齊藤です
>
>kuno@gssm.otsuka.tsukuba.ac.jp wrote:
>> 久野です。
先生方にも筆の誤り?
>> mkdir tmp
>> for i in *.F
>> do
>> sed 's/include \'\(.*\)\'/#include "\1"/' $i >tmp/$i
>> done
普通の shell だと「'」を含むような文字列は "" で quote し
た方が記述し易いと思います。
sed "s/include '\(.*\)'/#include \"\1\"/" $i >tmp/$i
久野センセのお使いの shell が何か存じませんが、私の確認出
来る範囲には、'' の中の「'」を「\」で escape 出来るような仕
様の shell は見つかりません。
for の文法は Bourne shell のようですが、この script をその
まま試してみると、sh/ash/ksh/bash/zsh 全て継続行の入力を促さ
れます。
# 普通の shell 文法では '' の中の meta character は「'」自
#身のみなので、一個目の「\'」で quote が完了し、続く「\'」
#は escape されて文字「'」となり、最後の「'」で quote が始
#まります。
# Bourne shell 系だと quote された文字列を複数行に渡って記
#述出来るので、$PS2 を表示して入力待ちになりますが、csh 系
#では複数行を記述出来ないので、csh/tcsh では「' が一致しな
#い」旨の message を吐きますね。
>\( なんて難しい大技ですね。もっとシンプルに、
> sed '/^include /s/^/#/' $i >tmp/$i
それだと「'」→「"」の変換が出来ませんから、s function を
もう一つ書かなくては。
sed "/^include /s/^/#/;s/'/\"/g" $i >tmp/$i
or
sed -e "/^include /{" -e "s/^/#/" -e "s/'/\"/g" -e "}" $i >tmp/$i
sed の実装により文法が微妙に異なるので、このうちどちらが有
効かは環境依存ですが、場合によってはどちらも通らないかも知れ
ません。
その場合 1liner では書けなくなりますが、こんな感じで書けば
どの sed でも通ると思います。
sed "/^include /{
s/^/#/
s/'/\"/g
}" $i >tmp/$i
--
しらい たかし
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