Maison > développement back-end > Golang > Comment gérer correctement les sauts de ligne ambigus dans les chaînes Go à partir de la sortie « exec.Command » ?

Comment gérer correctement les sauts de ligne ambigus dans les chaînes Go à partir de la sortie « exec.Command » ?

Susan Sarandon
Libérer: 2024-11-28 21:21:15
original
857 Les gens l'ont consulté

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

Gestion des sauts de ligne ambigus dans les chaînes Go

Lors de l'analyse de la sortie de chaîne d'une commande Linux à l'aide de exec.Command, la distinction entre les caractères "n" intégrés et les sauts de ligne réels peut être un défi.

Pour conserver les sauts de ligne prévus, envisagez la technique suivante :

Échappé Sauts de ligne

Il est possible que les caractères « n » intégrés soient en fait des versions échappées des sauts de ligne. Pour remédier à cela, remplacez les séquences "n" échappées par de vrais sauts de ligne :

output = strings.Replace(output, `\n`, "\n", -1)
Copier après la connexion

En utilisant des guillemets (``) pour définir la chaîne de remplacement, vous pouvez l'étendre sur plusieurs lignes si nécessaire.

Analyse ligne par ligne

Une fois les sauts de ligne échappés corrigés, vous pouvez utiliser bufio.NewScanner pour analyser la chaîne entière ligne par ligne :

scanner := bufio.NewScanner(strings.NewReader(output))
for scanner.Scan() {
    line := scanner.Text()
    fmt.Println(line)
}
Copier après la connexion

Cette approche divisera uniquement la chaîne au niveau des sauts de ligne réels, en préservant tous les caractères « n » incorporés dans le contenu de la ligne.

Exemple

L'exemple suivant illustre l'approche :

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
    }
}
Copier après la connexion

Sortie :

test1
123;
234;
345;
456;
567;
test4
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal