Go实现替换(覆盖)文件某一行内容的示例代码

 更新时间:2022年07月12日 09:43:28   作者:xiaoyaoyou.xyz  
本文主要介绍了Go实现替换(覆盖)文件某一行内容的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

1、前言

有这样一个需求,我们查找到文件中带有某个关键词的一行内容后,对该行内容进行替换,替换成我们需要的新内容,比如修改网络配置文件、修改图片地址、修改代码中所有关键词等,类似于编辑器中的关键词替换功能,只不过我们是直接判断文件而已。

2、实现覆盖某一行文件内容的思路

1、打开文件
2、读取文件每一行
3、根据关键词判断是否是需要覆盖的行,是的话则从行开头写内容,使其覆盖该行旧内容
由于是覆盖,所以我们有一个前提是新写入的内容长度需要大于等于旧内容的长度,至于新内容小于旧内容的情况下,我们在扩展中再做尝试,基本思路包括两个:1、写入空内容覆盖多出的位置(应该不行,可以试一下);2、新内容写入后直接加入换行,然后将之前文件剩余内容覆盖多出来的这部分,还是覆盖的思想。

3、实现覆盖某一行内容的代码示例

我们这里以修改我的虚拟机中的网络配置文件为例做一个简单的示例(记得先备份):

原本的Ubuntu配置文件内容:

$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto ens33
iface ens33 inet static
address 40.40.40.210
gateway 40.40.40.1
netmask 255.255.255.0

然后我们通过address、gateway、netmask等关键词来修改最后三行的内容,以此来修改配置文件中的ip地址、网关和子网掩码。

代码内容:

package main

import (
?? ?"bufio"
?? ?"fmt"
?? ?"io"
?? ?"os"
?? ?"strings"
)

func main() {
? ? //读写方式打开文件
?? ?file, err := os.OpenFile("/etc/network/interfaces", os.O_RDWR, 0666)
?? ?if err != nil {
?? ??? ?fmt.Println("open file filed.", err)
?? ??? ?return
?? ?}
? ? //defer关闭文件
?? ?defer file.Close()

? ? //获取文件大小
?? ?stat, err := file.Stat()
?? ?if err != nil {
?? ??? ?panic(err)
?? ?}
?? ?var size = stat.Size()
?? ?fmt.Println("file size:", size)

? ? //读取文件内容到io中
?? ?reader := bufio.NewReader(file)
?? ?pos := int64(0)
?? ?ip := "40.40.40.220"
?? ?gateway := "40.40.40.1"
?? ?netmask := "255.255.255.0"
?? ?for {
? ? ? ? //读取每一行内容
?? ??? ?line, err := reader.ReadString('\n')
?? ??? ?if err != nil {
? ? ? ? ? ? //读到末尾
?? ??? ??? ?if err == io.EOF {
?? ??? ??? ??? ?fmt.Println("File read ok!")
?? ??? ??? ??? ?break
?? ??? ??? ?} else {
?? ??? ??? ??? ?fmt.Println("Read file error!", err)
?? ??? ??? ??? ?return
?? ??? ??? ?}
?? ??? ?}
?? ??? ?fmt.Println(line)

? ? ? ? //根据关键词覆盖当前行
?? ??? ?if strings.Contains(line, "address") {
?? ??? ??? ?bytes := []byte("address " + ip + "\n")
?? ??? ??? ?file.WriteAt(bytes, pos)
?? ??? ?} else if strings.Contains(line, "gateway") {
?? ??? ??? ?bytes := []byte("gateway " + gateway + "\n")
?? ??? ??? ?file.WriteAt(bytes, pos)
?? ??? ?} else if strings.Contains(line, "netmask") {
?? ??? ??? ?bytes := []byte("netmask " + netmask + "\n")
?? ??? ??? ?file.WriteAt(bytes, pos)
?? ??? ?}

? ? ? ? //每一行读取完后记录位置
?? ??? ?pos += int64(len(line))
?? ?}
}

结果:

$ sudo ./go_build_test_go_linux 
[sudo] xx 的密码: 
file size: 180
# interfaces(5) file used by ifup(8) and ifdown(8)

auto lo

iface lo inet loopback

auto ens33

iface ens33 inet static

address 40.40.40.210

gateway 40.40.40.1

netmask 255.255.255.0

File read ok!
$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto ens33
iface ens33 inet static
address 40.40.40.220
gateway 40.40.40.1
netmask 255.255.255.0

关键点:每读取一行记录目前的移动位置,然后调用file.WriteAt进行内容覆盖写入(不能是追加方式),因为找到这一行的时候记录的位置正好是上一行的末尾,所以正好覆盖。

4、扩展

其实最方便的方式其实是shell脚本的方式,然后通过各种语言都可以调用,并且某些时候也可以单独执行脚本。

其次,对于新内容长度少于旧内容的长度时无法做到全部覆盖,这个时候就稍微麻烦一点,再下下一行的时候或者其余的内容全部读取然后覆盖写入即可。

不明白接口使用的查看一下官方的io包,后面我们也会再专注整理一下io标准库的接口。

到此这篇关于Go实现替换(覆盖)文件某一行内容的示例代码的文章就介绍到这了,更多相关Go 替换文件某一行内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • Golang干货分享之利用AST实现AOP功能

    Golang干货分享之利用AST实现AOP功能

    本文主要是一个纯干货分享,主要介绍了Golang如何利用AST实现AOP功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-04-04
  • golang logrus日志框架实例详解

    golang logrus日志框架实例详解

    logrus是一个可插拔的、结构化的日志框架,这篇文章主要介绍了golang logrus日志框架实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Go语言大揭秘:适用于哪些类型的项目开发?

    Go语言大揭秘:适用于哪些类型的项目开发?

    想知道Go编程语言适合开发哪些类型的项目吗?无论是网络服务、分布式系统还是嵌入式设备,Go都能轻松应对,本文将带你了解Go在各种场景下的应用,让你更好地选择和使用Go进行开发,需要的朋友可以参考下
    2024-01-01
  • 使用golang引入外部包的三种方式:go get, go module, vendor目录

    使用golang引入外部包的三种方式:go get, go module, ve

    这篇文章主要介绍了使用golang引入外部包的三种方式:go get, go module, vendor目录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 一文详解Golang的函数特性

    一文详解Golang的函数特性

    函数是?Golang?中非常重要的组成部分之一,它们提供了代码的可重用性和组织性。在本文中,我们将深入了解?Golang?函数的多个方面,希望对大家有所帮助
    2023-04-04
  • Go实现各类限流的方法

    Go实现各类限流的方法

    这篇文章主要介绍了Go实现各类限流的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • golang构建工具Makefile使用详解

    golang构建工具Makefile使用详解

    这篇文章主要为大家介绍了golang构建工具Makefile的使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Go语言常用的打log方式详解

    Go语言常用的打log方式详解

    Golang的log包短小精悍,可以非常轻松的实现日志打印转存功能,下面这篇文章主要给大家介绍了关于Go语言常用的打log方式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • 深入了解Go语言编译链接的过程

    深入了解Go语言编译链接的过程

    Go在编译时会将interface和channel关键字转换成runtime中的结构和函数调用,所以小编觉得很有必要就Go的编译过程理一理做个进行总结,下面就来和小编一起了解一下Go语言编译链接的过程吧
    2023-08-08
  • Go语言并发之Sync包的6个关键概念总结

    Go语言并发之Sync包的6个关键概念总结

    这篇文章主要为大家详细介绍了Go语言并发中Sync包的6个关键概念,文中的示例代码讲解详细,对我们深入学习Go语言有一定的帮助,需要的可以参考一下
    2023-05-05

最新评论

?


http://www.vxiaotou.com