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
Susan Sarandonoriginal
2024-11-28 21:21:15916parcourir

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)

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

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

Sortie :

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

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!

Déclaration:
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