• 締切済み

Bシェルでファイル中の文字列置換の方法について

Bシェルで複数のファイルを読み込み、 ファイル中のデータの先頭から6バイトがある特定の文字列の場合はそのままで、特定の文字列以外は空白に置換して出力したいのですが、 どのようにすればよいのでしょうか? お手数ですが、ご教示ください。

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.2

全体の骨組みはそれでもいいと思いますが、sed の行が補足の文章とコード部分で食い違っているので何が本当にやりたいのかわかりません。 sed のところに、!s とありますが、! は編集対象行条件の否定ですが、条件が何もなくいきなり !s と書くとどの行もsコマンドの編集対象でなくなるので、意味無いです。

kiyoto
質問者

お礼

お礼が遅くなりもうしわけありません。 アドバイスありがとうございました。

  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.1

Bシェルだけでは無理なので(bashなら何とかなるかも)、sed 等を使うことになります。 for f in file1 file2 file3 do sed -e '2,$b' -e '/^ABCDEF/b' -e 's/^....../ /' $f > $f.out mv $f.out $f done sed の動作の説明は、 (1) 2行目以降ならそのまま出力 (2) 行頭ががABCDEFならそのまま出力 (3) どちらでもなければ行頭6文字を空白6個に変更して出力 ただ、これだと全ファイルを全て書き換えます。ファイルサイズが大きくてファイル全体の書き換えを避けたいなら、CとかPerlとかを使う必要があります。 あと、ファイルがテキストファイルじゃなくてバイナリファイルのときもCやPerl等が必要です。

kiyoto
質問者

補足

ご回答ありがとうございました。 私の質問の記述があいまいで処理に誤解を招いているとまずいので、補足させていただきます。 複数のファイル(a.txt b.txt~)を順に読み込んで、1行目のデータABCDEF1234、2行目のデータ1234567890の場合、先頭6文字がABCDEF以外であれば空白6文字に置換したいと思っております。読み込むファイルの名称はテキストファイルにしておきます。なお、データ中には*や#などのメタキャラも存在します。 以下のような感じで作ってみたのですが、うまく置換できないでいます。 お手数ですが、よろしくお願いします。 { while read PGMID do touch $PGMID.chg { while read PGMSRC do sed -e '!s/^toukds/ /' $PGMSRC >> $PGMID.chg done } < $PGMID done } < pgmid.txt

関連するQ&A