我正在尝试通过以下代码读取linux命令生成的某些字符串输出:
out, err := exec.Command("sh", "-c", cmd).Output()
以上是[]byte
类型,如何区分行内容中包含的“\ n”字符与实际换行符?我试过了
strings.Split(output, "\n")
和
bufio.NewScanner(strings.NewReader(output))
但是每当看到“\ n”字符时它们都会分割整个字符串缓冲区。
好的,澄清一下,“虚幻”中断是字符串中包含的“\ n”字符,如下所示,
Print first result: "123;\n234;\n"
Print second result: "456;\n"
整个输出是一个大的多行字符串,它也可能包含一些其他引用的字符串,我在go程序中处理整个字符串输出,但我无法控制命令输出并添加反斜杠在“\ n”字符之前。
进一步说明:我的意思是处理包含字符串字符串的字节序列,并希望保留内部字符串中包含的“\n
”并使用外层“\n
”来打破线。因此对于以下字节序列:
First line: "test1"
Second line: "123;\n234;\n345;"
Third line: "456;\n567;"
Fourth line: "test4"
我希望在处理整个序列时获得3行,而不是总共7行。这是一个旧项目,但我记得我可以使用Python直接使用类似“for line in f
”的语法获取3行,并打印第二个内部字符串的内容而不是渲染它。
答案 0 :(得分:12)
"真实&#34>之间没有区别。和一个不真实的"换行。
如果您使用的是类Unix系统,则文本文件中行的结尾由LF或'\n'
字符表示。你不能在一行中间加上'\n'
个字符。
内存中的字符串可以包含任意数量的'\n'
个字符。字母"foo\nbar\n"
在写入文本文件时会创建两行"foo"
和"bar"
。
之间没有任何有效的区别
fmt.Println("foo")
fmt.Println("bar")
和
fmt.Printf("foo\nbar\n")
两者都打印相同的2行序列,如下所示:
fmt.Println("foo\nbar")
答案 1 :(得分:10)
你的" \ n"实际上是换行符的转义版本。您可以通过搜索转义版本并替换为非转义版本来替换掉实际换行符:
strings.Replace(sourceStr, `\n`, "\n", -1)
由于反引号内的字符串文字可以写在多行上,因此Go会转义它看到的任何换行符。
答案 2 :(得分:1)
encoding/csv
软件包可能适合您的需求:
package main
import (
"encoding/csv"
"fmt"
"strings"
)
const s = `First line: "test1"
Second line: "123;
234;
345;"
Third line: "456;
567;"
Fourth line: "test4"
`
func main() {
r := csv.NewReader(strings.NewReader(s))
r.Comma = ':'
r.TrimLeadingSpace = true
a, e := r.ReadAll()
if e != nil {
panic(e)
}
fmt.Printf("%q\n", a)
}
结果:
[
["First line" "test1"]
["Second line" "123;\n234;\n345;"]
["Third line" "456;\n567;"]
["Fourth line" "test4"]
]