c#2.0写的一个文本替换命令行工具

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Text.RegularExpressions;
using  System.IO;

namespace  replace
{
    
class Program
    
{
        
static void Main(string[] args)
        
{

            
if (args.Length == 0||(args.Length == 1 && (args[0== "/?" || args[0== "?" || args[0== "-?")))
            
{
                Console.WriteLine(
"replace 命令行工具");
                Console.WriteLine(
"作者:zj53hao@qq.com");
                Console.WriteLine(
"CSDN:http://blog.csdn.net/zj53hao");
                Console.WriteLine(
"用途:在很多需要动态更改某些软件的配置文件时非常有用");
                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine(
"replace 命令使用语法说明");
                Console.WriteLine(
"  replace [/?|?|-?]    显示帮助信息");
                Console.WriteLine(
"  replace [path/]filename search replace [/option]  替换文本文件中的字符串,支持通配符文件名");
                Console.WriteLine(
"  replace setname search replace [/option]  替换参数变量中的字符串");
                Console.WriteLine(
"/option参数说明:");
                Console.WriteLine(
"   i 区分大小写.  默认不区分");
                Console.WriteLine(
"   r 使用正则表达式查找文本。留空则使用纯文本替换");
                Console.WriteLine(
"   f 替换文件 默认");
                Console.WriteLine(
"   v 替换的是系统环境变量.和f不能同时出现");
                Console.WriteLine();
                Console.WriteLine(
"如: replace *.txt 查找字符串 替换字符串");
                Console.WriteLine(
"如: replace setname 查找字符串 替换字符串");
                Console.WriteLine(
"如: replace myinc/*.txt 查找字符串 替换字符串 /i");
                Console.WriteLine(
"如: replace setname 查找字符串 替换字符串 /irv");
            }

            
if (args.Length == 3)
            
{
                ReplaceFiles(args[
0],args[1],args[2],null);
            }


            
if (args.Length == 4)
            
{
                
if (args[3].Contains("v"))
                
{
                    ReplaceVariable(args[
0], args[1], args[2], args[3]);
                }

                
else
                
{
                    ReplaceFiles(args[
0], args[1], args[2], args[3]);
                }

            }


        }


        
/// <summary>
        
/// 替换环境变量中某个变量的文本值。可以是系统变量,用户变量,临时变量。替换时会覆盖原始值。小心使用
        
/// </summary>
        
/// <param name="variable"></param>
        
/// <param name="search"></param>
        
/// <param name="replace"></param>
        
/// <param name="options"></param>

        public static void ReplaceVariable(string variable, string search, string replace, string options)
        
{
            
string text=Environment.GetEnvironmentVariable(variable);
            System.Windows.Forms.MessageBox.Show(text);
            text
=ReplaceText(text, search, replace, options);
            Environment.SetEnvironmentVariable(variable, text);
            text 
= Environment.GetEnvironmentVariable(variable);
            System.Windows.Forms.MessageBox.Show(text);
        }




        
/// <summary>
        
/// 批量替换文件文本
        
/// </summary>
        
/// <param name="args"></param>

        public static void ReplaceFiles(string path,string search, string replace, string options)
        
{
            
            
string[] fs;
            
if(File.Exists(path)){
                ReplaceFile(path, search, replace, options);
                
return;
            }

            
if (Directory.Exists(path))
            
{
                fs 
= Directory.GetFiles(path);
                
foreach (string f in fs)
                
{

                    ReplaceFile(f, search, replace, options);
                }

                
return;
            }


            
int i=path.LastIndexOf("/");
            
if(i<0)i=path.LastIndexOf("/");
            
string d, searchfile;
            
if (i > -1)
            
{
                d 
= path.Substring(0, i + 1);
                searchfile 
= path.Substring(d.Length);
            }

            
else
            
{
                d 
= System.Environment.CurrentDirectory;
                searchfile 
= path;
            }


            searchfile 
= searchfile.Replace("."@".");
            searchfile 
= searchfile.Replace("?"@"[^.]?");
            searchfile 
= searchfile.Replace("*"@"[^.]*");
            
//System.Windows.Forms.MessageBox.Show(d);  System.Windows.Forms.MessageBox.Show(searchfile);
            if (!Directory.Exists(d)) return;
            fs 
= Directory.GetFiles(d);
            
foreach (string f in fs)
            
{
                
if(System.Text.RegularExpressions.Regex.IsMatch(f,searchfile))
                    ReplaceFile(f, search, replace, options);
            }

        }

        
        
/// <summary>
        
/// 替换单个文本文件中的文本
        
/// </summary>
        
/// <param name="filename"></param>
        
/// <param name="search"></param>
        
/// <param name="replace"></param>
        
/// <param name="options"></param>
        
/// <returns></returns>

        public static bool ReplaceFile(string filename, string search, string replace,string options)
        
{
            FileStream fs 
= File.OpenRead(filename);
            

            
//判断文件是文本文件还二进制文件。该方法似乎不科学
            byte b;
            
for (long i = 0; i < fs.Length; i++)
            
{
                b 
= (byte)fs.ReadByte();
                
if (b == 0)
                
{
                    System.Windows.Forms.MessageBox.Show(
"非文本文件");
                    
return false;//有此字节则表示改文件不是文本文件。就不用替换了
                }

            }


            
//判断文本文件编码规则。
            byte[] bytes = new byte[2];
            Encoding coding
=Encoding.Default;
            
if (fs.Read(bytes, 02> 2)
            
{
                
if (bytes == new byte[20xFF0xFE }) coding = Encoding.Unicode;
                
if (bytes == new byte[20xFE0xFF }) coding = Encoding.BigEndianUnicode;
                
if (bytes == new byte[20xEF0xBB }) coding = Encoding.UTF8;
            }


            fs.Close();

            
//替换数据
            string text=File.ReadAllText(filename, coding);
            text
=ReplaceText(text,search, replace, options);
            File.WriteAllText(filename, text, coding);
            
return true;
        }



        
/// <summary>
        
/// 替换文本
        
/// </summary>
        
/// <param name="text"></param>
        
/// <param name="search"></param>
        
/// <param name="replace"></param>
        
/// <param name="options"></param>
        
/// <returns></returns>

        public static string ReplaceText(string text, string search, string replace, string options)
        
{

            RegexOptions ops 
= RegexOptions.None;
            
if (options == null)  //纯文本替换
            {
                search 
= search.Replace("."@".");
                search 
= search.Replace("?"@"?");
                search 
= search.Replace("*"@"*");
                search 
= search.Replace("("@"(");
                search 
= search.Replace(")"@")");
                search 
= search.Replace("["@"[");
                search 
= search.Replace("["@"[");
                search 
= search.Replace("["@"[");
                search 
= search.Replace("{"@"{");
                search 
= search.Replace("}"@"}");
                ops 
|= RegexOptions.IgnoreCase;
            }

            
else
            
{
                
if(options.Contains("I"))ops |= RegexOptions.IgnoreCase;
            }


            text 
= Regex.Replace(text, search, replace, ops);
            
return text;
        }

    }

}

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CHANGE.EXE 是一个命令行方式处理对文件的修改工具,目标文件可以是任意大小任意格式。可以一次执行30条命令!非常地高效。 一、基本格式: change 源文件.txt /from “被替换的串” /to “替换串” /in “条件” 二、已知限制是它不支持长名,可能不认识一些windows下的特殊字符作文件名。对此,解决之道是以短文件名访问(例如:myfile~1.txt)。 三、详细功能列表: ⒈處理的文件不限大小,前提是磁盤上至少要有与目标文件等大的预留空间,用于临时存放其副本; ⒉不仅处理文本文件,也处理二进制文件; ⒊替入和换出的字符串长度可以不同; ⒋可以指定替换行为只在特定行发生,特定行的标志是有另一个指定的字符(串)出现,这个字符串还允许大小敏感; ⒌可以同时执行多达30个修改指令; ⒍支持子目录; ⒎兼容dos/Unix/Mac 文本格式; ⒏输入输出字符串可以是文本的(Ascii),也可以是十六进制值或十进制值; ⒐替换速的特快; ⒑具有备份选项,以防源文件可能损坏; ⒒替换工作可以交互式进行(控制台); ⒓除命令行、控制台它还允许把多条指令组合编制为一个控制文件一次执行; ⒔可以使用布尔变量; ⒕源文件名支持通配符; ⒖"*"用在指定的被修改字符串时,表示由当前位置到行尾的整个子串; ⒗在指定目标字符串时,可以设定“列”,仅当字符位于此范围内时才发生替换; ⒘可以按文件属性排除某个文件不被处理; ⒙可以排除某些行不处理; ⒚按ESC可以中止处理进程。 ⒛ 四、如何指定参数 当程序运行时,它将以如下三种方式读取参数: ⒈INI文件 ⒉系统环境变量 ⒊命令行 先看最常用的命令行语法。 To/From/In规范: FROM 被替换的文字 TO 用于替换的文字 TO (可选)指定发生替换行为的特定行标志 举例,设test.txt文件包含如下两行: The quick brown fox jumped over the lazy brown dog. 我们输入: change /from brown /to red /fox 则文件变为: The quick red fox jumped over the lazy brown dog. 即:有出现"fox"的那行"brown:被替换为"red",其它行不变。 如果所指定字符串包含空格或其他特殊字符,请用双引号,比如: CHANGE test.TXT /FROM "my music" /TO "my video" 或者用十六进制字符处理特殊字符,如: CHANGE test.TXT /FROM &H0D0A0D0A /TO &H0D0A (删除多余的行) 设定列宽的例子: change test.txt /from ok 5/10 /to no 只替换从第5列到第10列的ok 为 no,这个功能是按首字符认定位置的,比如有一个“ok”位于4,5列那么它不会被替换。 仅删除的例子: change test.txt /from no /to null (即:删除所有的no) 如果要忽略英文字母的大小,使用参数 /I 与DOS类似,可以用参数 /s 处理所有子目录中文件的替换工作 替换指定行的例子: change test.txt /from no /to re /lines 3-8 30-50 (即:只替换3到8行和30到50行的字符) 出于安全目的,该程序总要自动生成一个临时文件备份源文件,如果用 /N文件名 参数另指定一个输出文件,则没有临时文件输出。 要消除文件末尾多余的空格,可以用参数 /trim 使用布尔变量的例子: CHANGE TEST.TXT /FROM Apple /TO Banana /IN (red OR brown) AND NOT Pear 将替换apple为banana,但所在行必须有red或brown出现,并且没有Pear出现 本程序的返回误码意义: 0 无错,有修改 1 无错,无修改 253 提前中止 254 内部错误 255 语法错 件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值