当前位置: 首页 > news >正文

【GO】如何用 Golang 的 os/exec 执行 pipe 替换文件

背景

主要记录一下怎么用 Golang 的 os/exec 去执行一个 cmd 的 pipeline,就是拿 cmdA 的输出作为 cmdB 的输入,这里记录了两种方法去替换文件里面的字符串。 pipe 那个逻辑在 demo1 里。 另外一种是直接读文件做替换,一不小心两个都放进来了。

代码

package mainimport ("fmt""os""os/exec""path/filepath""regexp""strings"
)// *java.Objectfunc main() {// 定义正则表达式regex := regexp.MustCompile(`\*java\.Object\b`)// 要替换的字符串data := "var obj *java.Object"// 替换字符串data = regex.ReplaceAllString(data, "java.Object")// 打印替换后的字符串fmt.Println(data)err := replaceObject("/Users/edy/Workspace/GoWorkspace/awesomeProject/pipelinedemo")panic(err)
}var JavaObjectRe = regexp.MustCompile(`b\*java\.Object`)func replaceObject(path string) error {fs, err := os.ReadDir(path)if err != nil {return err}for _, f := range fs {fileName := filepath.Join(path, f.Name())if f.IsDir() {if err = replaceObject(fileName); err != nil {return err}} else if strings.HasSuffix(f.Name(), ".go") {data, err := os.ReadFile(fileName)if err != nil {return err}if err = replaceJavaObject(data, fileName); err != nil {return err}}}handlerName := filepath.Join(path, "handler.go")handler, err := os.ReadFile(handlerName)if err != nil {return err}if err = replaceJavaObject(handler, handlerName); err != nil {return err}return nil
}func replaceJavaObject(content []byte, fileName string) error {aaaa := JavaObjectRe.Find(content)println(string(aaaa))content = JavaObjectRe.ReplaceAll(content, []byte("java.Object"))err := os.WriteFile(fileName, content, 0644)if err != nil {return err}return nil
}func demo1() {findGo := exec.Command("find", ".", "-name", "*.go")sout, err := findGo.StdoutPipe()if err != nil {panic(err)return}bakGo := exec.Command("xargs", "sed", "-i", "-bak", "-e", "s/\\*java\\.Object/java\\.Object/g")bakGo.Stdin = soutbakGo.Stdout = os.Stdouterr = findGo.Start()if err != nil {panic(err)}err = bakGo.Start()if err != nil {panic(err)}err = findGo.Wait()if err != nil {panic(err)}err = bakGo.Wait()if err != nil {panic(err)}
}

相关文章:

  • SOFA Framework源代码及插件Win11编译开发环境配置
  • 数据库定义和操作语句的重要语法
  • 分布式系统架构设计之分布式缓存技术选型
  • Java实战项目三:图书借阅系统
  • 新版Edge卸载
  • spring Security源码讲解-WebSecurityConfigurerAdapter
  • HarmonyOS4.0系统性深入开发14AbilityStage组件容器
  • gookit/color - Go语言命令行色彩使用库教程
  • sql:定时执行存储过程(嵌套存储过程、使用游标)
  • 算法训练营第三十天|332.重新安排行程 51. N皇后 37. 解数独
  • 202402读书笔记|《当你老了》——灰蒙曙光比爱情温柔,清晨露珠比希望更可爱
  • 如何实现服务器主动向客户端推送实时数据
  • CSS尺寸单位详解(rpx、px、pt、em、rem、%、vh、vw的区别)
  • pod 基础 2
  • 惠普83752A合成扫频器/信号源0.01-20GHz
  • (三)从jvm层面了解线程的启动和停止
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • JavaScript中的对象个人分享
  • Laravel Mix运行时关于es2015报错解决方案
  • php的插入排序,通过双层for循环
  • rabbitmq延迟消息示例
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue-loader 源码解析系列之 selector
  • 初识 webpack
  • 山寨一个 Promise
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 移动端 h5开发相关内容总结(三)
  • Prometheus VS InfluxDB
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​Java并发新构件之Exchanger
  • #{} 和 ${}区别
  • #Ubuntu(修改root信息)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (二)c52学习之旅-简单了解单片机
  • (分布式缓存)Redis哨兵
  • (九)c52学习之旅-定时器
  • (转)EXC_BREAKPOINT僵尸错误
  • **CI中自动类加载的用法总结
  • .NET Core中的去虚
  • .net和php怎么连接,php和apache之间如何连接
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • :“Failed to access IIS metabase”解决方法
  • @ResponseBody
  • [C#]winform部署PaddleOCRV3推理模型
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [dfs] 图案计数
  • [echarts] y轴不显示0
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • [Java]深入剖析常见排序
  • [JavaEE] 线程与进程的区别详解
  • [javaSE] 看知乎学习工厂模式