- ベストアンサー
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.です。(できるだけ標準コマンドでできれほうがうれしいですが..)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
変換ルールがちょっと不明確な部分があります。 ・単語の区切りは空白 ・単語 単語 { ... という書式 ・satoh_IMD9Dのように置き換えられる対象は = の後の数値が対象? ・置換対象を "satoh_2番目の単語" に置き換える? 上記の前提をしていいのなら sed -e 's/\(^[^ ]*\) \([^ ]*\) { \([^=]*\)=\([0-9.]*\) \(.*\)$/\1 \2 { \3=satoh_\2 \5/' かな?
その他の回答 (2)
- amru05
- ベストアンサー率63% (33/52)
viならば以下の様な検索&置換でできるかも。。 %s/IC \(.*\) { \(.*\)=\(.*\) ER/IC \1 { \2=satoh_\1 ER/g ==> 正規表現とそのマッチングした文字を使用する方法を調べれば良いでしょう。 ちなみに上記例では 最初の\(.*\)がIMD9Dにマッチし 次の\(.*\)がTHICKNESSにマッチし それぞれが \1 \2で置換文字として使用されます。
お礼
no.2さんのvi版の方法ですね。no.2さんと同様大変参考になりました。ありがとうございます。ためしてみます。
- a-saitoh
- ベストアンサー率30% (524/1722)
sedかawk(もちろんperlでもrubyでもできますが)あたりが楽ではないでしょうか。 sedなら /^DIELECTRIC IMD9D/s/THICKNESS=[^ }]*/THICKNESS=satoh_IMD9D/ のような行を、置き換えパターンの数だけ並べればいいでしょう。
お礼
sedでこういった高度な置換をすればいいのですね。大変参考になりました。ありがとうございました。