|
388) DOSバッチでファイル内文字列操作 go 2003/07/09(水) 19:10 |
|
OSはNT4.0またはWin2000です。 識者の方どなたかご教示ください。 文字列を置換して最後に置換前の文字列にまた直すと いうバッチを作成したいのです。 具体的には、[a.txt]というファイルが以下の内容とします。 [a.txt] AA=xxx BB=yyy CC=zzz ここで"AA="という文字列を検索し、該当したらその値"xxx" を一時退避しておいて、AA=aaというように置換します。 そして最後にまたAA=xxxに置換しなおす(元にもどす)という バッチが作りたいので、どなたかお知恵を拝借できれば幸いです。 |
|
390) Re:DOSバッチでファイル内文字列操作 じゃく 2003/07/10(木) 08:24 |
|
>OSはNT4.0またはWin2000です。 > >識者の方どなたかご教示ください。 >文字列を置換して最後に置換前の文字列にまた直すと >いうバッチを作成したいのです。 >具体的には、[a.txt]というファイルが以下の内容とします。 > >[a.txt] >AA=xxx >BB=yyy >CC=zzz > >ここで"AA="という文字列を検索し、該当したらその値"xxx" >を一時退避しておいて、AA=aaというように置換します。 >そして最後にまたAA=xxxに置換しなおす(元にもどす)という >バッチが作りたいので、どなたかお知恵を拝借できれば幸いです。 goさんこんにちは。 相談内容について質問があります。 上記の手順は (1)文字列が複数行有るテキストファイル(=a.txt)内の 特定の行の内容を置換する。 (2)そのテキストファイルで「何か」を処理する (3)最後にテキストファイルを置換前の文字列に戻す ということでいいですか? (1)について 置換対象となる AA=xxx を AA=aaと直すとのことですが 置換対象は AA= で始まる行すべてなのか AA=xxx に一致する 行すべてなのか知りたいです。 また、AAやaaは置換対象として固定で考えていいですか? 起動時に指定できる方がいいですか? (2)の部分が全く見えませんが、(1)や(3)への影響は ない処理なのですか? A.TXTを使うのですよね? (3)については、置換前の文字列を一時待避するのではなく、 A.TXTごと別名でコピーして、最後にA.TXTにリネームするように するほうが簡単だと思います。 以上質問ばかりですが、このあたりがはっきりすると具体的な バッチの回答が出てくると思います。 |
|
396) Re:DOSバッチでファイル内文字列操作 ふぇむ 2003/07/10(木) 18:37 |
|
>文字列を置換して最後に置換前の文字列にまた直すというバッチを作成したいのです。 >[a.txt] >AA=xxx >BB=yyy >CC=zzz >ここで"AA="という文字列を検索し、該当したらその値"xxx" >を一時退避しておいて、AA=aaというように置換します。 (他略) 加工自身は、sed ないし awk のスクリプトを書いてやればすごく簡単に所望の加工ができると思います。「元に戻す」のは、元のファイルをコピーしておいて後で上書きで戻してやればいいと思います。(sed.exe や gawk.exe等はGNUのツールです) ご存知だと思いますが、一応ご紹介しておくと、sed はストリームエディタで、行単位でパターンマッチさせて文字列置換することに特化したツールです。awk は行単位処理ながらもう少し汎用的で、入力したテキストファイル(パイプ渡しでもよい)に対し、指定したパターンにマッチする各1行を、指定した分離文字 (指定しないと空白文字)で分割した各ワード $1 $2 .... $NF で参照でき($0で行全体)、変数や関数を定義し利用してC言語ライクな構文でロジックが書けるスクリプトで、以下のような標準形です。パターンマッチ処 理を書かないブロックは全ての行にマッチします。 BEGIN { 初期処理 } パターンマッチ指示 { 必要な処理 } パターンマッチ指示 { 必要な処理 } .... function 自分で定義する関数( 仮引数 ){ 必要な関数定義 } function 自分で定義する関数( 仮引数 ){ 必要な関数定義 } .... END { 終処理 } 文字列サーチや分割等の基本的な組み込み関数、例えば「何行目」とかを示す組み込み変数、などなど揃っていますし、処理の中でコマンドラインのコマンドも 実行できるし結果の標準出力も取り込めます。ファイルも読めます。バッチコマンド系とうまく組み合わせて使うと、かなり効果的だと思います。 sed なら、上の形だとスクリプトは単純に s/AA=.*$/AA=aa/ だけで済みそうですね。sed の部分をインラインで書いて、バッチの骨組みとしては copy a.txt bup-a.txt sed 's/^AA=.*$/AA=aa/' bup-a.txt > a.txt なんかの処理 copy bup-a.txt a.txt みたいな形でいいのでしょうか。 ただ、これだと、全ての AA= で始まる行が変ってしまうので、もう少し条件や構文解析等が必要なら、awk のスクリプトにして copy a.txt bup-a.txt gawk -f gawkのスクリプトを記述したテキストファイル bup-a.txt > a.txt なんかの処理 copy bup-a.txt a.txt みたいにして、「gawkのスクリプトを記述したテキストファイル」に構文解析に関することを書けばよいと思います。例えばあるブロックの中のものとか、例えば最初の1個目だけとか、その他必要に応じ書けるだけの表現力はあると思います。 なお、私が利用しているWindowsのコマンドラインで使える awk は、 gawk.exe で、 Gnu Awk (gawk) 2.15, patchlevel 4 + multi-byte extension 1.03 となっています。このバージョンであまり問題を感じてないです。ご参考まで。 |