【问题标题】:Go lang differentiate "\n" and line breakGo lang 区分“\n”和换行符
【发布时间】:2015-11-09 15:40:52
【问题描述】:

我正在尝试通过以下代码读取 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 行,然后打印第二个内部字符串的内容而不是渲染它。

【问题讨论】:

  • 什么是“真正的换行符”? “\n”什么时候是“不真实”的换行符?
  • 根据操作系统(和/或文件格式),换行符是\n,或者是\r\n,或者是\r。没有什么可以“区分”的;该字节(或 \r\n 的情况下的字节对)换行符。相反,如果您碰巧指的是“\”字符后跟“n”,则可以在 Go 中将其写为 "\\n" 或反引号文字字符串(我无法弄清楚如何在 SO 的降价中正确显示)。

标签: go split


【解决方案1】:

“真实”和“非真实”换行之间没有区别。

如果您使用的是类 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")

【讨论】:

    【解决方案2】:

    您的“\n”可能实际上是换行符的转义版本。您可以通过搜索转义版本并用非转义版本替换这些换行符:

    strings.Replace(sourceStr, `\n`, "\n", -1)

    由于反引号内的字符串文字可以写成多行,Go 会转义它看到的任何换行符。

    【讨论】:

    • 我想要一些可以用来将所有 EOL 事件转换为 <br> 以格式化消息以提交给 Microsoft Teams(通过 webhook 请求)。您的回答帮助我解决了问题。如果有帮助,我使用的项目中的修改/工作功能通过下面的 Go Playground 链接提供。我不能说它的正确性,因为我还没有完全测试它。 play.golang.org/p/LQU5rO1I7Bw
    【解决方案3】:

    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"]
    ]
    

    https://golang.org/pkg/encoding/csv

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 2014-04-28
      • 1970-01-01
      • 2016-11-14
      • 2014-02-23
      相关资源
      最近更新 更多