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]);
            }
        }

    }

    /// 
    /// 交换环境变量中某个变量的文本值。可以是系统变量,用户变量,临时变量。交换时会覆盖原始值。小心运用
    /// 
    /// 
    /// 
    /// 
    /// 
    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);
    }
    /// 
    /// 批量交换文件文本
    /// 
    /// 
    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);
        }
    }
    
    /// 
    /// 交换单个文本文件中的文本
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    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, 0, 2) > 2)
        {
            if (bytes == new byte[2] { 0xFF, 0xFE }) coding = Encoding.Unicode;
            if (bytes == new byte[2] { 0xFE, 0xFF }) coding = Encoding.BigEndianUnicode;
            if (bytes == new byte[2] { 0xEF, 0xBB }) coding = Encoding.UTF8;
        }

        fs.Close();

        //交换数据
        string text=File.ReadAllText(filename, coding);
        text=ReplaceText(text,search, replace, options);
        File.WriteAllText(filename, text, coding);
        return true;
    }
    /// 
    /// 交换文本
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    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;
    }
}

}

本文转自博客园知识天地的博客,原文链接:c#2.0开发的一个文本字符串替换工具,控制台工具,可以批量替换 转载请自行联系原博主。

相关文章
|
7天前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
78 51
|
4天前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
14 1
|
5天前
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
22 2
|
15天前
|
测试技术 Go C#
C#一分钟浅谈:ReSharper 插件增强开发效率
【10月更文挑战第25天】ReSharper 是 JetBrains 开发的一款 Visual Studio 插件,旨在提高 .NET 开发者的生产力。它通过代码分析、重构、导航等功能,帮助开发者避免常见错误,提升代码质量和开发效率。本文将通过具体代码案例,详细介绍 ReSharper 的常见功能及其应用。
33 1
|
20天前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
6月前
|
Java
java实战项目超市管理系统控制台版
java实战项目超市管理系统控制台版
|
6月前
|
Java
【Java开发指南 | 第二十篇】Java流之控制台
【Java开发指南 | 第二十篇】Java流之控制台
53 2
|
6月前
|
XML 监控 Dubbo
Dubbo03【管理控制台和监控中心搭建】,Java开发实用必备的几款插件
Dubbo03【管理控制台和监控中心搭建】,Java开发实用必备的几款插件
|
6月前
|
存储 Java 关系型数据库
景区特色商品管理系统【控制台+MySQL】(Java课设)
景区特色商品管理系统【控制台+MySQL】(Java课设)
55 1
|
6月前
|
存储 Java 关系型数据库
银行储蓄管理系统【控制台+MySQL】(Java课设)
银行储蓄管理系统【控制台+MySQL】(Java课设)
68 1