Heim >Backend-Entwicklung >Golang >Wie behandelt man mehrdeutige Zeilenumbrüche in Go-Strings aus der „exec.Command'-Ausgabe richtig?

Wie behandelt man mehrdeutige Zeilenumbrüche in Go-Strings aus der „exec.Command'-Ausgabe richtig?

Susan Sarandon
Susan SarandonOriginal
2024-11-28 21:21:15872Durchsuche

How to Properly Handle Ambiguous Line Breaks in Go Strings from `exec.Command` Output?

Umgang mit mehrdeutigen Zeilenumbrüchen in Go-Strings

Beim Parsen der String-Ausgabe eines Linux-Befehls mit exec.Command kann zwischen eingebetteten „n“ Zeichen und tatsächlichen Zeilenumbrüchen unterschieden werden Seien Sie anspruchsvoll.

Um die beabsichtigten Zeilenumbrüche beizubehalten, beachten Sie Folgendes Technik:

Escaped-Zeilenumbrüche

Es ist möglich, dass die eingebetteten „n“ Zeichen tatsächlich maskierte Versionen von Zeilenumbrüchen sind. Um dies zu beheben, ersetzen Sie die maskierten „n“-Sequenzen durch echte Zeilenumbrüche:

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

Durch die Verwendung von Backticks (``) zum Definieren der Ersatzzeichenfolge können Sie diese bei Bedarf über mehrere Zeilen erstrecken.

Zeilenweises Parsen

Sobald die maskierten Zeilenumbrüche korrigiert sind, können Sie bufio.NewScanner verwenden, um Analysieren Sie die gesamte Zeichenfolge Zeile für Zeile:

scanner := bufio.NewScanner(strings.NewReader(output))
for scanner.Scan() {
    line := scanner.Text()
    fmt.Println(line)
}

Bei diesem Ansatz wird die Zeichenfolge nur an tatsächlichen Zeilenumbrüchen geteilt, wobei alle eingebetteten „n“ Zeichen im Zeileninhalt erhalten bleiben.

Beispiel

Das folgende Beispiel demonstriert den Ansatz:

import (
    "bufio"
    "bytes"
    "fmt"
    "os/exec"
    "strings"
)

func main() {
    output, err := exec.Command("sh", "-c", "echo \"test1\n123;\n234;\n345;\n456;\n567;\ntest4\"").Output()

    if err != nil {
        fmt.Println(err)
        return
    }

    // Replace escaped line breaks with real line breaks
    output = bytes.Replace(output, `\n`, []byte("\n"), -1)

    // Parse the corrected string line by line
    scanner := bufio.NewScanner(bytes.NewReader(output))
    for scanner.Scan() {
        line := scanner.Text()
        fmt.Println(strings.TrimSpace(line)) // Trim leading/trailing whitespace
    }
}

Ausgabe:

test1
123;
234;
345;
456;
567;
test4

Das obige ist der detaillierte Inhalt vonWie behandelt man mehrdeutige Zeilenumbrüche in Go-Strings aus der „exec.Command'-Ausgabe richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn