Am scris o funcție bash pentru a imprima secțiuni de text incluse între linii care se potrivesc ## modul: org
și ## # Sfârșitul organizației
într-un fișier, cu o linie goală între secțiuni. Inainte de ##
, poate exista orice număr de spații.
Iată un exemplu de fișier din care să extragă informații.
fișier: test.sh
## modul: org
## * Folosind instrucțiunea case
## # Sfârșitul organizației
caz $arg in
("V")
ecou "Autor"
;;
(*)
## modul: org
## ** Modul de raportare silențioasă a erorilor (SERM) în getopts
## *** Detectează avertismente fără a tipări mesaje încorporate.
## *** Activat de două puncte {:} ca prim caracter în opțiunile scurte.
## # Sfârșitul organizației
pauză
;;
esac
Ieșirea dorită ar fi
Cod:
* Folosind declarația caz
** Modul de raportare silențioasă a erorilor (SERM) în getopts
*** Detectează avertismente fără a imprima mesaje încorporate.
*** Activat de două puncte {:} ca prim caracter în shortopts.
Iată funcția pe care o folosesc
capture-org ()
{
local efile="$1"
local begsec="## mod: org"
local endsec="## # Sfârșitul organizației"
sed -n "/^[[:space:]]*${begsec}$/,/^[[:space:]]*${endsec}$/s/ *//p'" "$efile" |
sed 's/^'"${begsec}"'$/\n'"${begsec}"'/' |
sed '/^'"${begsec}"'$/d' | sed '/^'"${endsec}"'$/d' | taie -c 3-
}
Aș dori să simplific funcția, folosind variabile pentru a construi modele. Dar am nevoie de asistență pentru a compila comenzi împreună, astfel încât să nu fiu nevoit să apelez sed
de atâtea ori.
Poate folosind awk
ar fi o strategie mai bună.
capture-org ()
{
local efile="$1"
local begsec='^[[:space:]]*## mod: org$'
local endsec='^[[:space:]]*## # Sfârșitul org$'
sed -n "/${begsec}/,/${endsec}/s/ *//p" "$efile" |
sed 's/^## # Sfârşitul org$/## # Sfârşitul org\n/' |
sed '/^## modul: org$/d' | sed '/^## # Sfârşitul org$/d' | taie -c 3-
}