Ich verwende die folgende Bash-Funktion, um Zeilen zwischen ## mode: rec
und zu erfassen ## # End of rec
, kann den Zeilenabstand #
im Ergebnis jedoch nicht entfernen.
capture ()
{
local efile="$1"
local begorg endorg
begorg='^[[:space:]]*## mode: org$'
endorg='^[[:space:]]*## # End of org$'
awk -v bego="$begorg" -v endo="$endorg" \
'$0 ~ bego { flag=1; next }
$0 ~ endo { flag=0; }
flag { sub(/^[[:space:]]*#[[:space:]]*/,""); print }' "$efile"
}
Dies ist die Eingabe
Datei: 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
## mode: org
## HDG: Handling function argument parsing with getopts
## Rmk: No call to {shift} is required with getopts
## Rmk: No hyphen {-} required when searching option names
## + Case patterns do not start with option hyphen {-} because
## + getopts strips off the hyphen and makes the value of {arg}
## + to be just the option letter.
## Rmk: Separating options from non-options with --
## + {getopts} stops processing options when the argument is not
## + defined as an option in {shortopts}; or if the argument is
## + "--", which explicitly terminates the list of options.
## Rmk: Using -- as value to an option
## + An option value can be -- without it being considered a
## + separator between options and non-options.
## + Example { edvart-getopts -g "--" }.
## Rmk: Explicitly testing for {--}
## + There is no need to test for {--} when using {getopts}.
## # End of org
Aber ich bekomme dieses Ergebnis
# * 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.
# HDG: Handling function argument parsing with getopts
# Rmk: No call to {shift} is required with getopts
# Rmk: No hyphen {-} required when searching option names
# + Case patterns do not start with option hyphen {-} because
# + getopts strips off the hyphen and makes the value of {arg}
# + to be just the option letter.
# Rmk: Separating options from non-options with --
# + {getopts} stops processing options when the argument is not
# + defined as an option in {shortopts}; or if the argument is
# + "--", which explicitly terminates the list of options.
# Rmk: Using -- as value to an option
# + An option value can be -- without it being considered a
# + separator between options and non-options.
# + Example { edvart-getopts -g "--" }.
# Rmk: Explicitly testing for {--}
# + There is no need to test for {--} when using {getopts}.
# HDG: Silent Error Reporting Mode (SERM) in getopts
# Rmk: Detects warnings without printing built-in messages.
# Rmk: Enabled by colon {:} as first character in shortopts.
Das erwartete Ergebnis ist
* 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.
HDG: Handling function argument parsing with getopts
Rmk: No call to {shift} is required with getopts
Rmk: No hyphen {-} required when searching option names
+ Case patterns do not start with option hyphen {-} because
+ getopts strips off the hyphen and makes the value of {arg}
+ to be just the option letter.
Rmk: Separating options from non-options with --
+ {getopts} stops processing options when the argument is not
+ defined as an option in {shortopts}; or if the argument is
+ "--", which explicitly terminates the list of options.
# Rmk: Using -- as value to an option
+ An option value can be -- without it being considered a
+ separator between options and non-options.
+ Example { edvart-getopts -g "--" }.
Rmk: Explicitly testing for {--}
+ There is no need to test for {--} when using {getopts}.
HDG: Silent Error Reporting Mode (SERM) in getopts
Rmk: Detects warnings without printing built-in messages.
Rmk: Enabled by colon {:} as first character in shortopts.
Antwort1
Sie erhalten dieses Ergebnis, weil Sie Ihrem Programm ausdrücklich anweisen, nur eins zu entfernen #
. Und das macht es:
sub(/^[[:space:]]*#[[:space:]]*/,"")
Wenn Sie das ändern, um #+
ein oder mehrere zu entfernen #
, funktioniert es wie erwartet. Als nächstes möchten Sie eine leere Zeile zwischen den Abschnitten, also brauchen Sie eine zusätzliche, print ""
wenn Sie das Ende finden. Ändern Sie Ihre Funktion folgendermaßen:
capture ()
{
local efile="$1"
local begorg endorg
begorg='^[[:space:]]*## mode: org$'
endorg='^[[:space:]]*## # End of org$'
awk -v bego="$begorg" -v endo="$endorg" \
'$0 ~ bego { flag=1; next }
$0 ~ endo { flag=0; print "" }
flag { sub(/^[[:space:]]*#+[[:space:]]*/,""); print }' "$efile"
}
Das Obige ergibt:
$ capture file
* 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.
HDG: Handling function argument parsing with getopts
Rmk: No call to {shift} is required with getopts
Rmk: No hyphen {-} required when searching option names
+ Case patterns do not start with option hyphen {-} because
+ getopts strips off the hyphen and makes the value of {arg}
+ to be just the option letter.
Rmk: Separating options from non-options with --
+ {getopts} stops processing options when the argument is not
+ defined as an option in {shortopts}; or if the argument is
+ "--", which explicitly terminates the list of options.
Rmk: Using -- as value to an option
+ An option value can be -- without it being considered a
+ separator between options and non-options.
+ Example { edvart-getopts -g "--" }.
Rmk: Explicitly testing for {--}
+ There is no need to test for {--} when using {getopts}.
Beachten Sie, dass diese Zeile dadurch nicht kommentiert bleibt, wie in Ihrer Beispielausgabe, aber ich nehme an, dass es sich dabei nur um einen Fehler handelte, da an dieser Zeile nichts Besonderes zu sein scheint:
# Rmk: Using -- as value to an option
Antwort2
Sie können es mit diesem Befehl versuchen
awk '{sub(/^#*/,"",$0);print }' filename