68user's page 掲示板

Prev< No. 2277> Next  [最新発言に戻る] [過去ログ一覧]
No. 2277 # 68user 2001/11/19 (月) 14:17:20
>>2271 初心者みーです。
複数ファイルの中身を一括置換する、という目的に限れば、
    http://x68000.startshop.co.jp/~68user/unix/pickup?perl
の perl -pi.bak -e .. ところをどうぞ。

> findコマンドで、ファイル(シェル)中に/usr/kokyakuと
> 記述されているファイル名をfindコマンドで探す場合は、
> どのように記述すればよいのでしょうか?
いろいろありますが、以下のような感じです。

    % find . -exec grep -l /usr/kokyaku {} \;
          … 機能は実現できるけど、遅い。
    % grep -l *
          … ファイル数が多すぎるとダメ。ファイル数が数千程度ならこれでいいでしょう。
    % find . -print | xargs grep -l
          … ファイル数が多くても OK。
    % find . -print0 | xargs -0 grep -l
          … ファイル数が多くても OK。ファイル名に改行が含まれていても OK。

今回は grep -l でいいのではないでしょうか。

あと、
> sed 's/\/usr\/kokyaku/\/usr\/okyaku/g' * >*の出力
で実現できることはわかっているので、後はこれを複数のファイルに対して実
行すればよいのです。いろいろ方法はありますが、お勧めなのは「文字列をい
じくってコマンドラインを作り、sh に喰わせる」方法です。

grep -l * で、
    file1
    file2
    file3
という出力が得られるとします。次に
    grep -l * | sed "s|\(.*\)|sed 's./usr/kokyaku./usr/okyaku/.g' < \1 > out/\1 | "
とすると、
    sed 's./usr/kokyaku./usr/okyaku/.g' < ./file1 > out/./file1
    sed 's./usr/kokyaku./usr/okyaku/.g' < ./file2 > out/./file2
    sed 's./usr/kokyaku./usr/okyaku/.g' < ./file3 > out/./file3
という文字列が得られます。それをよく確認して、よさそうなら
    grep -l * | sed "s|\(.*\)|sed 's./usr/kokyaku./usr/okyaku/.g' < \1 > out/\1 | " | sh
と末尾に | sh を付ければ、そのまま実行されます。

正しいコマンドラインができるまでは「| sh」を付けずに試行錯誤すれば
よいので、いろいろなところで応用が効くと思います。

Prev< No. 2277> Next  [最新発言に戻る] [過去ログ一覧]