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:
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.
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.
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!