gosplit

Go lang differentiate "\n" and line break


I am trying read certain string output generated by linux command by the following code:

out, err := exec.Command("sh", "-c", cmd).Output()

The above out is of []byte type, how can I differentiate the "\n" character contained in line content with the real line break? I tried

strings.Split(output, "\n")

and

bufio.NewScanner(strings.NewReader(output))

but they both split the whole string buffer whenever seeing a "\n" character.

OK, to clarify, an "unreal" break is a "\n" character contained in a string as follows, Print first result: "123;\n234;\n" Print second result: "456;\n"

The whole output is one big multi-line string, it may also contain some other quoted strings, and I am processing the whole string output in my go program, but I can't control the command output and add a back slash before the "\n" character.

Further clarify: I meant to process byte sequence which contains string of strings, and want to preserve the "\n" contained in the inner string and use the the outer layer "\n" to break lines. So for the following byte sequence:

First line: "test1"
Second line: "123;\n234;\n345;"
Third line: "456;\n567;"
Fourth line: "test4"

I want to get 3 lines when processing the whole sequence, instead of getting 7 total lines. It's a old project, but I remember I can use Python to directly get 3 lines using syntax like "for line in f", and print the content of second inner string instead of rendering it.


Solution

  • There is no distinction between a "real" and an "unreal" line break.

    If you're using a Unix-like system, the end of a line in a text file is denoted by the LF or '\n' character. You cannot have a '\n' character in the middle of a line.

    A string in memory can contain as many '\n' characters as you like. The string "foo\nbar\n", when written to a text file, will create two lines, "foo" and "bar".

    There is no effective difference between

    fmt.Println("foo")
    fmt.Println("bar")
    

    and

    fmt.Printf("foo\nbar\n")
    

    Both print the same sequence of 2 lines, as does this:

    fmt.Println("foo\nbar")