アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。
「a.log の xxx と yyy のある行を削除」
というようなshellScriptを書いています。

a.logは以下のようになっています。
a.log
111xxx111
222yyy222
333zzz333
222yyy222
444aaa444
555bbb555
111xxx111

xxx、yyyの複数パターンで行の削除はできないでしょうか。
sedで中間ファイル(ワークファイル)を2回作成すればできるのですが…
なるべく中間ファイルは作成したくありません。

最終的にはa.logを下記のようにしたいです。
a.log
333zzz333
444aaa444
555bbb555

宜しくお願い致します。

A 回答 (3件)

perlが使えると思いますので、


perl -e 'print if !(/xxx|yyy/);' -n a.log > b.log
としてみて下さい。
b.logに
333zzz333
444aaa444
555bbb555
が書き込まれます。
    • good
    • 0
この回答へのお礼

ありがとうございました!
perlを使うのは盲点でした。
試してみます。
迅速なご回答、有り難う御座いました。

お礼日時:2007/03/10 10:18

perlをつかっていいのなら


> perl -e 'print if !(/xxx|yyy/);' -n a.log > b.log

perl -i.bak -ne 'print if !(/xxx|yyy/)'

でいいと思います。
-i オプションで上書きとバックアップファイルの拡張子を指定しています。
このばあいは a.log.bak が書き換え前の状態のファイルになります。
    • good
    • 0
この回答へのお礼

有り難う御座いました!
できました!
本当に助かりました。

お礼日時:2007/03/12 18:37

a.logを読み込みながらa.logに書き込むのは無理なので、中間ファイルを1つも使わない、ということは難しいでしょう。



grep -v xxx a.log | grep -v yyy > b.log
mv b.log a.log

という感じでいかがでしょうか。

Solarisの grep で使えるかどうかわかりませんが、-Eが使えるなら、

grep -v -E 'xxx|yyy' > b.log
mv b.log a.log

でもいけるかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました!
お恥ずかしい話ですがgrepにこんな使い方があったのを知りませんでした…
-Eも使用できるみたいです。
御教示いただきましたperlとgrepを組み合わせて簡易フィルタシェルを書いてみようと思います。
迅速なご回答、有り難う御座いました。

お礼日時:2007/03/10 10:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!