• ベストアンサー

UNIXでのテキストファイル処理

UNIX上のテキストファイルの文字列変換処理をやりたいと思っています。 DIELECTRIC IMD9D { THICKNESS=101.00 ER=uuu } ↓ DIELECTRIC IMD9D { THICKNESS=satoh_IMD9D ER=uuu } 101.00→satoh_IMD9Dとなる”IMD9D”は行の2単語目の単語で行によって文字列は変ります。 このような書式の行が数百行あるので,できるだけ簡単に一括変換をやりたいと考えています。 処理方法は,viでもシエルでも簡単にできればO.K.です。(できるだけ標準コマンドでできれほうがうれしいですが..)

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

変換ルールがちょっと不明確な部分があります。 ・単語の区切りは空白 ・単語 単語 { ... という書式 ・satoh_IMD9Dのように置き換えられる対象は = の後の数値が対象? ・置換対象を "satoh_2番目の単語" に置き換える? 上記の前提をしていいのなら sed -e 's/\(^[^ ]*\) \([^ ]*\) { \([^=]*\)=\([0-9.]*\) \(.*\)$/\1 \2 { \3=satoh_\2 \5/' かな?

Kasaoka-Taroh
質問者

お礼

sedでこういった高度な置換をすればいいのですね。大変参考になりました。ありがとうございました。

その他の回答 (2)

  • amru05
  • ベストアンサー率63% (33/52)
回答No.3

viならば以下の様な検索&置換でできるかも。。  %s/IC \(.*\) { \(.*\)=\(.*\) ER/IC \1 { \2=satoh_\1 ER/g ==> 正規表現とそのマッチングした文字を使用する方法を調べれば良いでしょう。  ちなみに上記例では   最初の\(.*\)がIMD9Dにマッチし   次の\(.*\)がTHICKNESSにマッチし  それぞれが \1 \2で置換文字として使用されます。

Kasaoka-Taroh
質問者

お礼

no.2さんのvi版の方法ですね。no.2さんと同様大変参考になりました。ありがとうございます。ためしてみます。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

sedかawk(もちろんperlでもrubyでもできますが)あたりが楽ではないでしょうか。 sedなら /^DIELECTRIC IMD9D/s/THICKNESS=[^ }]*/THICKNESS=satoh_IMD9D/ のような行を、置き換えパターンの数だけ並べればいいでしょう。

関連するQ&A