Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengendalikan Pemisahan Talian Ambiguous dalam Go Strings daripada Output `exec.Command` dengan betul?

Bagaimana untuk Mengendalikan Pemisahan Talian Ambiguous dalam Go Strings daripada Output `exec.Command` dengan betul?

Susan Sarandon
Susan Sarandonasal
2024-11-28 21:21:15872semak imbas

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

Mengendalikan Putus Talian Ambiguous dalam Rentetan Go

Apabila menghuraikan output rentetan daripada arahan Linux menggunakan exec.Command, membezakan antara aksara "n" terbenam dan pemisah baris sebenar boleh menjadi mencabar.

Untuk mengekalkan pemisah baris yang dimaksudkan, pertimbangkan perkara berikut teknik:

Escaped Line Breaks

Ada kemungkinan bahawa aksara "n" yang dibenamkan sebenarnya adalah versi pelarian bagi barisan. Untuk membetulkan ini, gantikan urutan "n" yang terlepas dengan pemisah baris sebenar:

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

Dengan menggunakan tanda belakang (``) untuk mentakrif rentetan gantian, anda boleh merentangkannya pada berbilang baris jika perlu.

Penghuraian Baris demi Baris

Setelah pemisah baris yang terlepas dibetulkan, anda boleh menggunakan bufio.NewScanner untuk menghuraikan keseluruhan rentetan baris demi baris:

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

Pendekatan ini hanya akan membelah rentetan pada pemisah baris sebenar, mengekalkan sebarang aksara "n" terbenam dalam kandungan baris.

Contoh

Contoh berikut menunjukkan pendekatan:

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
    }
}

Output:

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

Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Pemisahan Talian Ambiguous dalam Go Strings daripada Output `exec.Command` dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn