J'ai écrit une fonction bash pour imprimer des sections de texte enfermées entre des lignes correspondantes. ## mode: org
y ## # End of org
dans un fichier, avec une ligne vide entre les sections. Avant le ##
il peut y avoir un nombre quelconque d'espaces.
Voici un exemple de fichier dont on peut extraire des informations.
file: test.sh
## mode: org
## * Using case statement
## # End of org
case $arg in
("V")
echo "Author"
;;
(*)
## mode: org
## ** Silent Error Reporting Mode (SERM) in getopts
## *** Detects warnings without printing built-in messages.
## *** Enabled by colon {:} as first character in shortopts.
## # End of org
break
;;
esac
La sortie souhaitée serait
Code :
* Using case statement
** Silent Error Reporting Mode (SERM) in getopts
*** Detects warnings without printing built-in messages.
*** Enabled by colon {:} as first character in shortopts.
Voici la fonction que j'utilise
capture-org ()
{
local efile="$1"
local begsec="## mode: org"
local endsec="## # End of org"
sed -n "/^[[:space:]]*${begsec}$/,/^[[:space:]]*${endsec}$/s/ *//p'" "$efile" |
sed 's/^'"${begsec}"'$/\n'"${begsec}"'/' |
sed '/^'"${begsec}"'$/d' | sed '/^'"${endsec}"'$/d' | cut -c 3-
}
Je voudrais simplifier la fonction, en utilisant des variables pour construire des modèles. Mais j'ai besoin d'aide pour compiler les commandes ensemble de manière à ne pas avoir à appeler sed
tant de fois.
Peut-être qu'en utilisant awk
serait une meilleure stratégie.
capture-org ()
{
local efile="$1"
local begsec='^[[:space:]]*## mode: org$'
local endsec='^[[:space:]]*## # End of org$'
sed -n "/${begsec}/,/${endsec}/s/ *//p" "$efile" |
sed 's/^## # End of org$/## # End of org\n/' |
sed '/^## mode: org$/d' | sed '/^## # End of org$/d' | cut -c 3-
}