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

背景

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

代码

复制代码
package main

import (
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"regexp"
	"strings"
)

// *java.Object

func 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 = sout
	bakGo.Stdout = os.Stdout

	err = 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)
	}
}
相关推荐
江畔柳前堤1 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
Figo_Cheung1 小时前
Figo基于RNC理论的宇宙演化第七纪元猜想
开发语言·php
泡海椒2 小时前
JQuick-Curl 二次开发:自定义解析器、扩展点开发指南,如何把框架能力真正变成团队资产
java·开发语言·okhttp·maven
WWJA王文举3 小时前
FreeRTOS事件组和任务通知详解:为什么任务通知比队列更轻量?
开发语言·php
wuyk5554 小时前
12.归并排序:分治思想的稳定排序算法
开发语言·数据结构·算法·排序算法
吴声子夜歌4 小时前
ApacheCommons——commons-text(模板替换与文本算法)
java·开发语言·算法·apache
quantdash_cc5 小时前
量化数据源怎么选:稳定性、实时性和数据完整性到底该如何权衡?
开发语言·python·数据分析·量化交易·股票数据·quantdash
萧瑟余晖5 小时前
Java深入解析篇五十四之对象模型详解
java·开发语言
张文是假的啊5 小时前
Java | record | Controller逻辑
java·开发语言
不甘先生5 小时前
Go 中 type、方法与指针接收者:从 str_name.Name() 看懂 Go 的类型系统
开发语言·后端·golang