J'ai un fichier formaté comme ceci: Ce que je dois pouvoir faire est de lire toutes les valeurs d'une section spécifique. P> 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? P> merci p> p>
3 Réponses :
Deux options à l'esprit - utilisez un filtre (par exemple, Avec sortie: (placer l'échantillon d'entrée dans la propriété p.txt) p> awk code>,
sed code>) pour extraire la section correspondante ou utiliser Bash pour filtrer dans la section spécifique.
bash code>, à l'aide d'une fonction: p>
Item west
Item east
Item north
Found Area 4
Missing FOO
Utilisation de vous pouvez Essayez ici . P> P> 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>
La puissance étonnante de sed code> (+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 code> Les commandes malheureusement ne traduisent pas si bien en anglais.
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
S'il vous plaît ajouter ceci à votre question précédente
Ce n'est pas clair, veuillez ajouter plus de détails dans votre question.