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开发的一个文本字符串替换工具,控制台工具,可以批量替换 转载请自行联系原博主。

相关文章
|
8月前
|
XML 测试技术 API
利用C#开发ONVIF客户端和集成RTSP播放功能
利用C#开发ONVIF客户端和集成RTSP播放功能
4499 123
|
物联网 数据处理 C#
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据。在自动化、物联网以及工业控制行业中,上位机开发是一项重要的技能。本教程主要介绍使用C#进行上位机开发,重点在于串口通信和数据处理。
2725 82
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
537 51
|
SQL Java 测试技术
C#字符串拼接的6种方式及其性能分析对比
在C#编程中字符串拼接是一种常见且基础的操作,广泛应用于各种场景,如动态生成SQL查询、构建日志信息、格式化用户显示内容等。然而,不同的字符串拼接方式在性能和内存使用上可能存在显著差异。今天咱们一起来看看在C#中字符串拼接的常见6种方式及其使用BenchmarkDotNet进行性能分析对比。
461 6
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
545 0
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
687 12
|
程序员 C# 数据库
C# 比较对象新思路,利用反射技术打造更灵活的比较工具
中途接手的项目,碰到需要在更新对象信息时比较并记录差异的需求,最变态的还有附加要求,怎么办?有没有既能满足需求又能对项目影响最小的方法呢?分享这个我封装的方法,一个利用反射技术打造的更灵活的比较工具
276 5
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
494 2
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
1017 1
|
测试技术 Go C#
C#一分钟浅谈:ReSharper 插件增强开发效率
【10月更文挑战第25天】ReSharper 是 JetBrains 开发的一款 Visual Studio 插件,旨在提高 .NET 开发者的生产力。它通过代码分析、重构、导航等功能,帮助开发者避免常见错误,提升代码质量和开发效率。本文将通过具体代码案例,详细介绍 ReSharper 的常见功能及其应用。
1118 1