-2

I have the following bash function that uses sed to extract sections occurring between ## Mode: org and ## # End of org, where # is the comment character. Finally I remove the comment character and any spaces.

This is my input

cat /home/flora/docs/recnotes.txt
   ## Mode: org
   #  Assigns shell positional parameters or changes the values of shell
   #  options.  The -- option assigns the positional parameters to the
   #  arguments of {set}, even when some of them start with an option
   #  prefix `-'.
   ## # End of org

     ;; Mode: org
     ;  Assigns shell positional parameters or changes the values of shell
     ;  options.  The -- option assigns the positional parameters to the
     ;  arguments of {set}, even when some of them start with an option
     ;  prefix `-'.
     ;; # End of org
 
       @c Mode: org
       @c  Assigns shell positional parameters or changes the values of shell
       @c  options.  The -- option assigns the positional parameters to the
       @c  arguments of {set}, even when some of them start with an option
       @c  prefix `-'.
       @c # End of org

Here is the bash function with implementation in sed.

capture ()
{
 local efile="$1"

 local charcl begorg endorg

 charcl_ere='^[[:space:]]*([#;!]+|@c|\/\/)[[:space:]]*'
 charcl_bre='^[[:space:]]*\([#;!]\+\|@c\|\/\/\)[[:space:]]*'

 begorg="${charcl_bre}"'Mode: org$'
 endorg="${charcl_bre}"'# End of org$'

 mdr='^Mode: org$' ; edr='^# End of org$'

 sed -n "/$begorg/,/$endorg/ s/$charcl_bre//p" "$efile" |
  sed "/$mdr\|$edr/d"
}

Originally, I had the two commands as

begorg='${charcl_bre}Mode: org$'
endorg='${charcl_bre}# End of org$'

which were not expanding the variable charcl_bre.

The output is

Assigns shell positional parameters or changes the values of shell
options.  The -- option assigns the positional parameters to the
arguments of {set}, even when some of them start with an option
prefix `-'.
Assigns shell positional parameters or changes the values of shell
options.  The -- option assigns the positional parameters to the
arguments of {set}, even when some of them start with an option
prefix `-'.
Assigns shell positional parameters or changes the values of shell
options.  The -- option assigns the positional parameters to the
arguments of {set}, even when some of them start with an option
prefix `-'.

What I would like to do is have a blank line between sections.

muru
  • 193,181
  • 53
  • 473
  • 722
Fatipati
  • 361
  • 1
  • 9

1 Answers1

0

According to your latest edit, you just need to have a blank line between the different comment sections. You can do that by changing the last sed command from:

sed "/$mdr\|$edr/d"

to:

sed "/$mdr/d; s/$edr//"

This changes the sed command from deleting both $mdr and $edr lines to only deleting the $mdr line and replacing the $edr line with an empty string, effectively keeping the blank line you want.

The output is:

Assigns shell positional parameters or changes the values of shell
options.  The -- option assigns the positional parameters to the
arguments of {set}, even when some of them start with an option
prefix `-'.

Assigns shell positional parameters or changes the values of shell
options.  The -- option assigns the positional parameters to the
arguments of {set}, even when some of them start with an option
prefix `-'.

Assigns shell positional parameters or changes the values of shell
options.  The -- option assigns the positional parameters to the
arguments of {set}, even when some of them start with an option
prefix `-'.
BeastOfCaerbannog
  • 12,964
  • 10
  • 49
  • 77