-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
  • 197,895
  • 55
  • 485
  • 740
Fatipati
  • 379

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 `-'.