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.