Macro/投稿/173 のバックアップソース(No.1)



* Grepから正規表現複数キーワード置換 [#b7021703]
-ページ: [[Macro/投稿]]
-作者: [[ぼさがみ]]
-カテゴリー: js
-投稿日: 2007-05-10 (木) 14:30:46

** メッセージ [#v93cf8f9]
	
	//MultiRepExp.js
	//Grep結果から正規表現で一気に置換します。
	//複数キーワード置換対応。
	
	var oFileSys = new ActiveXObject("Scripting.FileSystemObject");
	var oShell = new ActiveXObject("WScript.Shell");
	var oVbScript = new ActiveXObject("ScriptControl");
	
	function VbsInputBox(sMessage, sTitle, sDefault){
		oVbScript.Language = "VBScript";
		oVbScript.AddCode("Function InputBox2(sMessage, sTitle, sDefault) InputBox2 = InputBox(sMessage, sTitle, sDefault) End Function");
		var sResult = oVbScript.Run("InputBox2", sMessage, sTitle, sDefault);
		return sResult;
	}
	
	Main();
	
	function Main(){
		Editor.SelectAll(0);
		var sAllText = Editor.GetSelectedString();
		if(sAllText.indexOf("□検索条件") < 0){
			oShell.Popup("Grepを先に実行してください。", 0 , "MultiRepExp");
			return;
		}
	
		//キーワード複数入力
		var aRegExp = new Array();
		while(true){
			var sSearch = VbsInputBox("検索するテキストを入力してください。\n(空欄で次へ進む)", "MultiRepExp", "");
			if(sSearch == null)	return;
			if(sSearch == "")	break;
			var sTransfer = VbsInputBox("置換後のテキストを入力してください。", "MultiRepExp", sSearch);
			if(sTransfer == null)	return;
			var oRegExp = new RegExp(sSearch, "gm");
			oRegExp.sBefore = sSearch;
			oRegExp.sAfter = sTransfer;
			aRegExp.push(oRegExp);
		}
		if(aRegExp.length == 0){
			return;
		}
	
		var sMessage = "置換しますか?\n";
		for(var nLoop = 0; nLoop < aRegExp.length; nLoop++){
			sMessage += "置換前:" + aRegExp[nLoop].sBefore + "\n";
			sMessage += "置換後:" + aRegExp[nLoop].sAfter + "\n";
		}
		if(oShell.Popup(sMessage, 0 , "MultiRepExp", 1) != 1){
			return;
		}
	
		//Grep画面を解析
		var aSearchPath = new Array();
		sAllText = sAllText.substr(sAllText.indexOf("□検索条件"));
		sAllText = sAllText.substr(sAllText.indexOf("\r\n\r\n"));
		var aAllTextLine = sAllText.split("\r\n");
		var oPathCheck = new ActiveXObject("Scripting.Dictionary");
	
		for(var nLoop3 = 0; nLoop3 < aAllTextLine.length; nLoop3++){
			var sLine = aAllTextLine[nLoop3];
			if(sLine.indexOf("  [") >= 0){
				sLine = sLine.substr(0, sLine.indexOf("  [") + 2);
				sLine = sLine.substr(0, sLine.lastIndexOf(((sLine.indexOf(")  ") >= 0)? "(": "  ")));
				if(oFileSys.FileExists(sLine) && !oPathCheck(sLine)){
					oPathCheck(sLine) = true;
					aSearchPath.push(sLine);
				}
			}
		}
	
		//ひたすら置換
		for(var nLoop = 0; nLoop < aSearchPath.length; nLoop++){
			var sPath = aSearchPath[nLoop];
			try{
				var oFile = oFileSys.OpenTextFile(sPath, 1);
				if(oFile.AtEndOfStream){
					oFile.Close();
					continue;
				}
			}
			catch(excep){
				oShell.Popup("読み込みエラーです。\n" + sPath + "\n" + excep, 0 , "MultiRepExp");
				return;
			}
	
			var sText = oFile.ReadAll();
			oFile.Close();
			for(var nLoop4 = 0; nLoop4 < aRegExp.length; nLoop4++){
				var sText = sText.replace(aRegExp[nLoop4], aRegExp[nLoop4].sAfter);
			}
			try{
				var oDestFile = oFileSys.CreateTextFile(sPath, true)
				oDestFile.Write(sText)
				oDestFile.Close();
			}
			catch(excep){
				oShell.Popup("書き込みエラーです。\n" + sPath + "\n" + excep, 0 , "MultiRepExp");
				return;
			}
		}
		oShell.Popup("正常終了しました。", 0 , "MultiRepExp");
	}


----
- EUC-jpのファイルはだめです。 -- [[sheep]] &new{2007-06-13 (水) 12:03:53};
- Macro - 133 のような、詳しい使用方法の説明をして欲しい。 -- [[じゅうじ]] &new{2009-05-09 (土) 05:46:23};

#comment


    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS