-1
votes

Bash - Lire les lignes de la section du fichier

J'ai un fichier formaté comme ceci: xxx

Ce que je dois pouvoir faire est de lire toutes les valeurs d'une section spécifique. xxx

Les exemples que j'ai trouvés en ligne sont pour les fichiers INI, qui ont des paires de valeur clé. Quelqu'un peut-il aider à conseiller comment je peux faire cela?

merci


1 commentaires

Ce n'est pas clair, veuillez ajouter plus de détails dans votre question.


3 Réponses :


2
votes

Deux options à l'esprit - utilisez un filtre (par exemple, awk code>, sed code>) pour extraire la section correspondante ou utiliser Bash pour filtrer dans la section spécifique.

Avec bash code>, à l'aide d'une fonction: p> xxx pré>

sortie: (placer l'échantillon d'entrée dans la propriété p.txt) p>

Item west
Item east
Item north
Found Area 4
Missing FOO


0 commentaires

2
votes

Utilisation de SED code>:

category=MOTOR; sed -nE "/^\[$category\]$/{:l n;/^(\[.*\])?$/q;p;bl}" /path/to/your/file
  • / motif / code> exécute la commande suivante ou le groupe de commandes lorsque la ligne actuelle correspond au motif li>
  • {Commandes} code> regroupe les commandes, par exemple pour les exécuter conditionnel. Li>
  • : l code> définit une étiquette nommée "L", que vous pourrez sauter à. li>
  • n code> demande sed code> pour commencer à travailler sur la ligne suivante. LI>
  • q code> sort li>
  • p code> imprime la ligne actuelle li>
  • BL code> saute à "L" étiquette li> ul>

    vous pouvez Essayez ici . P> P>


3 commentaires

La puissance étonnante de sed (+1). Un inconvénient est que le script complexe SED nécessite que des développeurs super intelligents se développent, et même des développeurs plus intelligents à mettre à jour.


Merci - cela fonctionne vraiment bien, mais il serait bon d'expliquer ce que ça fait


@Rocket J'ai ajouté un détail des commandes utilisées, j'espère qu'en plus de l'explication ci-dessus, cela le rend compréhensible. SED Les commandes malheureusement ne traduisent pas si bien en anglais.



0
votes

L'alternative consiste à utiliser un programme externe pour filtrer l'entrée. Cela peut fournir un avantage de performance si le fichier d'entrée est très important ou si une logique supplémentaire est nécessaire.

function filter_section {
    local id=$1
    awk -v ID="$id" '/^\[/ { p= ($0 == "[" ID "]" ); next } p && $0 { print }' < p.txt
}

function read_section {
    local id=$1
    local match
    input=()
    while read p ; do
        # Do something with '$p'
        input+=("$p")
        echo "Item $p"
    done <<< $(filter_section "$id")
    # Indicate section not found
    [ "${#input[*]}" -gt 0 ] && return 0
    return 1
}

if read_section "AREA" < p.txt ; then
        echo "Found Area" "${#input[$@]}"
else
        echo "Missing AREA"
fi

if read_section "FOO" < p.txt ; then
        echo "Found FOO"
else
        echo "Missing FOO"
fi


1 commentaires

S'il vous plaît ajouter ceci à votre question précédente