【问题标题】:replace string with patterns in file用文件中的模式替换字符串
【发布时间】:2017-07-11 05:40:48
【问题描述】:

我使用 sed 替换 *.go 文件中的变量,使用 sed -i 's/\<old_name\>/newName/g' *.go 我的目标是消除 golinter 错误。 如何使用常见模式的字符串,例如用 2 替换 1

  1. fmt.Printf("blah blah blah")fmt.Printf("yadda yadda yadda")
  2. fmt.Println("blah blah blah")fmt.Println("yadda yadda yadda")

在这种情况下,我们不想替换: 1. fmt.Printf("print speed= %d",speed) //所以这里的关键是结束模式应该是")。 2. log.Printf statements //仅替换“fmt”。 有没有这方面的指点?

【问题讨论】:

    标签: go sed golint


    【解决方案1】:

    我对您的问题有点困惑,但认为您正在尝试执行以下操作:

    replace      printf("yada yada yada") with println("yada yada yada")
    not replace  printf("print speed = %d", speed)
    

    如果是这样的话,我会做如下的事情:

    sed -i '/Printf(\".*\")/ s/Printf/Println/g' *.go
    

    这应该使您真正想要使用格式的情况保持不变。这是一个例子:

    [sborza@msandn]:~$ cat tester.go
    package main
    
    import "fmt"
    
    func main() {
            speed = 1
            fmt.Printf("vim-go")
            fmt.Printf("speed = %d\n", speed)
    }
    
    [sborza@msandn]:~$ sed '/Printf(\".*\")/ s/Printf/Println/g' tester.go
    package main
    
    import "fmt"
    
    func main() {
            speed = 1
            fmt.Println("vim-go")
            fmt.Printf("speed = %d\n", speed)
    }
    

    【讨论】:

    • OP 想要替换 printf,而不是 Printf。如果同一行有多个printf,则贪婪模式.*可能会产生意想不到的结果(有些以")结尾,有些则没有。
    • 没关系,无论哪种情况,这个例子都成立。关于贪婪的公平点,但作为一个快速+肮脏的修复,这就足够了。
    【解决方案2】:

    gofmt -w -r "printf -> println" .
    

    请注意,在执行此操作之前先备份文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      相关资源
      最近更新 更多