gpt4 book ai didi

Goland 读取每行命令输出的衬垫

转载 作者:IT王子 更新时间:2023-10-29 02:15:03 24 4
gpt4 key购买 nike

我想每行读取一个输出命令行。为此,我使用了 StdoutPipe 方法和 bufio 库:

package main

import (
"encoding/json"
"fmt"
"log"
"os/exec"
"bufio"
)


func main() {
cmd := exec.Command("printf", "{\"Name\": \"Bob\", \"Age\": 1}\n%.0s", "{1..5}")
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}
scanner := bufio.NewScanner(stdout)
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
var person struct {
Name string
Age int
}
for scanner.Scan() {
if err := json.Unmarshal([]byte(scanner.Text()), &person); err != nil {
log.Fatal(err)
} else {
fmt.Printf("%s is %d years old\n", person.Name, person.Age)
}
}
if err := cmd.Wait(); err != nil {
log.Fatal(err)
}
}

我应该获得 5 行:

$ printf "{\"Name\": \"Bob\", \"Age\": 1}\n%.0s" {1..5}
{"Name": "Bob", "Age": 1}
{"Name": "Bob", "Age": 1}
{"Name": "Bob", "Age": 1}
{"Name": "Bob", "Age": 1}
{"Name": "Bob", "Age": 1}

关键是我只得到第一行。我是 Go 的新手,我猜 StdoutPipe 的用法不正确。

最佳答案

{1..5} 被 shell 扩展为 1 2 3 4 5,所以你必须自己做:

cmd := exec.Command("printf", `{"Name": "Bob", "Age": %s}\n`, `1`, `2`) // etc.

还要注意原始字符串的使用,它比不断转义所有内容要方便得多。在相关说明中,您应该真正使用 []byte(scanner.Text()) 而不是 scanner.Bytes()

关于Goland 读取每行命令输出的衬垫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35221537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com