「A文字列」〜「B文字列」の間に「X文字列」が無いファイルを検出させて、「A文字列」の直後に「X文字列」を追加させたい


手元には、「TextSS」というソフトがありますが、このソフトでは不可能みたいなので、可能なソフトと方法を教えてください
できれば、使用する特殊記号の意味も説明していただけると、ありがたいです
(こういう動作だから今回はこうなる、というような説明)

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/11/21 19:27:10
  • 終了:--

回答(3件)

id:jouno No.1

jouno回答回数280ベストアンサー獲得回数02005/11/22 00:26:49

ポイント100pt

http://rubyforge.org/frs/?group_id=167

RubyForge: One-Click Ruby Installer: Project Filelist

rubyをインストールして、以下をtrans.rbのファイルにして(なお”を半角に戻してください)newというフォルダをつくっておいて、beforeをA文字列afterをB文字列、patternをX文字列に書き直し、

ruby trans.rb *.txt

のようにすればnewのなかに処理されたファイルができているはずです。

----------------------

#!//usr/local/bin/ruby --


BEFORE=”before”

AFTER=”after”

PATTERN=”patern”


ARGV.each{|file|

str = File.read(file)

str.gsub!(/(#{BEFORE})(.*)(#{AFTER})/){|s|

s2 = $1 + PATTERN + $2 + $3

$2.match(/#{PATTERN}/) ? s : s2

}

File.open(”new/”+file,”w”){|fh|

fh.print str

}

}

-------------------

何をやっているのかは、簡単に言うとまず、AとBの文字列の間に何かの文字列、という並びを検索し、それから、その挟まれている文字列にX文字列が含まれているかどうかを検査しています。


この二段階が必要なので、普通の検索や正規表現ではたぶん無理です。(もしかしたら正規表現だけで再帰を利用すれば可能かもしれませんがたぶん無理だと思います)

http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%C0%B5%B...

Rubyリファレンスマニュアル - 正規表現

正規表現については

http://www.tohoho-web.com/wwwperl1.htm#Expr

とほほのperl入門(概要編)

こちらもどうぞ。

もうちょっと簡単なやり方を考えてみたのですが、ちょっと思いつきません。「何々が含まれない」というのはちょっと処理が面倒なのです。ここのソフトのdevasなどは今回の用途には使えませんが、かなり強力です。

http://www.vector.co.jp/soft/win95/util/se162621.html

Devas(Windows95/98/Me / ユーティリティ)

ただし、ちょっと条件がはっきりしないのですが、

A文字列とX文字列の間にはほかの文字列は入るのでしょうか。もしもA文字列X文字列B文字列が隙間なく並んでいて、X文字列があったりなかったりする、そして、それ以外のパターンのファイルはない、というのなら、話はかなり簡単になります。

A文字列B文字列をA文字列X文字列B文字列に置換すればいいだけなので、たとえばdevasで

オプションを正規表現検索で行単位で検索にしておいて、

(A文字列)(B文字列)

で検索して

¥1X文字列¥2

に置換すればいいです。

この際のぞみ通りになるかどうか、検索結果の確認でまず確認しておいてから実行してください。

意味は、¥1は最初の括弧、¥2は二番目の括弧です。だから結果としてA文字列X文字列B文字列になるわけです。

id:aki73ix No.2

aki73ix回答回数5224ベストアンサー獲得回数272005/11/22 10:59:53

ポイント100pt

変換の条件が良くわからないのですが作ってみました

汎用性は全然ありませんが(^^;


・A文字列かB文字列がない場合は処理しない

・最初に出てきたA文字列の後にあるB文字列だけを1回判定

・ファイルサイズには制限なし

・A文字列をヘッダ、Bをフッタとする

・A,B,Xの文字列は32kまで

・A,B,Xで特殊文字を使う場合はURLエンコード(例えば改行は%0d%0a)

・出力先フォルダは同じフォルダは指定できない

・大文字小文字の区別は決めれられる


とりあえず問題があれば、後一回回答できるのでコメントしてもらえれば直します

id:oldroot No.3

oldroot回答回数1ベストアンサー獲得回数02005/11/22 23:13:13

ポイント50pt

ファイル名の話をしているのですよね。

Windows なら以下のようなバッチファイルではどうでしょうか。


setlocal enabledelayedexpansion

for /f ”tokens=*” %%A in (’dir /b AAA*BBB ^| findstr /v /r AAA.*XXX.*BBB’) do (

set f=%%A

ren ”!f!” ”!f:AAA=AAAXXX!”

)

endlocal


UNIX 系で bash が使えるのなら

#!/bin/bash


/bin/ls AAA*BBB | grep -v ’AAA.*XXX.*BBB’ | ( while read file

do

mv ”$file” ”${file/AAA/AAAXXX}”

done )


特殊記号の意味は、すみません、たくさんありすぎて説明できません。

id:watson

操作を誤ったみたいで、と言うか初めての質問で要領を得なくて、1・2番の回答に返事できなくなりました。 なので、ここで返事させてもらいます。

***** 1.jounoさん *****

> 何々が含まれない」というのはちょっと処理が面倒なのです。…

やはりそうでしたか。 在るものを検出するのは簡単でも、無いものを検出するのは…というのは何となく解ってました。 どの正規表現を見ても、「含まれない」という表現はたぶん無いですよね。 なので、「含まれる」ファイルから削除させて、全ファイルに追加する、という2段階の方法で対処してました。 でも、「含まれる」を検出できるなら「含まれない」も…という妄想に駆られまして、質問してみました。

> もしもA文字列X文字列B文字列が隙間なく並んでいて…

そうなんですよ、それなら話しが簡単ですけどね。 しかも、他の文字列のパターンが一定ではないのです。 一定だったら、AまたはB文字列に含めることができますよね。 HTMLファイルなので良く似ているけど…ってとこです。

ところで、プログラムを作っていただいて、本当にありがとうございます。 Rubyを入れるなら、その前にパソコン内の環境を整えたい(そろそろ初期化を)と思っているので、まだ入れてないですが、ぜひ試してみたいと思ってます。 ありがとうございました。 m( _”_ )m

***** 2.aki1731xさん *****

プログラムを作っていただいて、ありがとうございます。 検証したところ、ファイルの末尾に何か追加されてしまいます。 一定ではないので、この下にいくつか提示します。

Lァ�

ワ・

¥,ロ・

H簗

Shift-JISではないみたいです。ひょっとしてバイナリコード? 末尾は</HTML>が多いですが、それ以外のファイルにも追加されてました。

この追加と変換以外は、改変されていない(文字列比較ソフトで5つのファイルを確認済み)です。

それと、まだ以下を確認できてません。

・ 検索対象フォルダの直下とその直下層まで確認、つまり2階層まで確認しているが、それ以下も検索および変換されているか?

でも、これ↑↑↑は確認しなくても大丈夫ですよね。

・ 変換対象に同名ファイルがある場合は、変換したファイルの名前を変更するのか?フォルダを作成するのか?

index.htm(l)なんかは、たくさんあります。 今回の検証では変換後のindex.htmが1つだけだったので、まさか重複で上書きされて1つになった?…とか思いました。 この辺りが確認できてません。

で、重宝しそうで使い続けると思いますが、拡張子フィルターとか… 検索フォルダと変換で作成されるフォルダのディレクトリ構成が同じだといいナァとか… 厚かましい!!・・・スンマセン m( _”_ )m

***** 3.oldrootさん *****

気づかなかったけど、誤解させる文章ですよね。 なので、そういう質問をしたことにしてポイントを考えます。

2005/11/25 00:40:31
  • id:aki73ix
    修正版

    ・出力ファイルにゴミが入る不具合を修正しました
    ・ファイル名にフィルタを指定できるようになりました
    ・元のフォルダ構成を復元してファイル展開するようにしました

    これで、完璧・・・だといいのですが
    http://nifberry.727.net/test/hatena159a.lzh
  • id:watson
    Re:修正版

    要望まで実現していただいてすみません。
    検証したところ、フィルタを使うと変換されませんでした。
    「*」(?も)は、ワイルドカードですよね。
    「*.htm」を使って変換したところ、変換数がゼロでした。
  • id:aki73ix
    Re(2):修正版

    >「*.htm」を使って変換したところ、変換数がゼロでした。

    一応確認してみましたが、こちらでは問題なかったです
    次の2点について御確認ください

    ・ヘッダとフッタを指定していない
    ・該当するヘッダとフッタが存在しなかった
    ・検索フォルダの中に出力先フォルダがある(処理が終わらなくなります)
  • id:watson
    Re(3):修正版

    色々と検証したところ、フィルターを使うとサブディレクトリが対象にならないことが解りました。

    ・Aフォルダを作成して、その中にBフォルダを作成
    ・Aフォルダ直下にA,txtを作成して、Bフォルダの直下にB.txtを作成
    フィルター「*.txt」で変換すると、A.txtだけが変換された
  • id:aki73ix
    さらに修正版

    >色々と検証したところ、フィルターを使うとサブディレクトリが対象にならないことが解りました。

    あ、本当ですね
    遅くなりましたが、対応しました

    >
    >・Aフォルダを作成して、その中にBフォルダを作成
    >・Aフォルダ直下にA,txtを作成して、Bフォルダの直下にB.txtを作成
    >フィルター「*.txt」で変換すると、A.txtだけが変換された
    >

    http://nifberry.727.net/test/hatena159b.lzh
  • id:watson
    Re:さらに修正版

    わざわざ何回も、ありがとうございます
    末永く、使わせていただきます
    ともに白髪が生えるまで・・・(笑)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません