# If you'd like to omit non-matching lines from the result; add ';d' to the end of the expression.
sed -E 's/(?imx)
(^\h*) # capture les espaces avant #cs (ex. < >#cs)
(
\# (?> cs|comments-start ) \b\N*\R # => #cs
# => commentaires (partie entre #cs et #ce)
(?:
# vérifie qu'il s'agit bien d'un commentaire
# c.-à-d. que le début de la ligne NE doit PAS être suivi par ce qui
# correspond à un début (#cs) ou fin de commentaire (#ce)
(?!
\h* \# (?> cs|comments-start|ce|comments-end ) \b\N*\R
)
# le commentaire
# un commentaire peut simplement être une nouvelle ligne (\R)
\N*\R
| # commentaire ou récursion (si aucun commentaire trouvé)
# récursion (depuis le début) pour chercher un nouveau #cs
(?R)
)* # les commentaire sont facultatifs
\h* \# (?> ce|comments-end ) # => #ce
\b\N*? # texte après #ce, facultatif (ex. #ce< TEXTE>)
)
# capture, s'il y en a, les espaces et la fin de ligne après #ce (ex. #ce blabla...< \R>)
(
\h*+ $ # espaces après #ce ; seulement ceux avant la fin de ligne (ex. #ce blabla...< >$)
\R? # retour à la ligne facultatif
)/[\1]<span class="S2">\2<\/span>[\3]/imxg;t' <<< " #cs xyz
gna
#cs xyz
gna gna
#ce #ce
#ce #ce
#ce
#cs xyz
gna gna
#ce xyz
-------------------------------------
#cs
...
#
#cs
#cs
#cs
...
#cs
...
#ce
#ce
#ce
#ce
;#ce
#ce
#ce
-------------------------------------
#comments-start BON
...
#
#cs
...
#cs
...
#ce
#ce
...
#ce
-------------------------------------
#comments-start BON
...
#
#comments-start
...
#cs
...
#comments-end
#ce
...
#comments-end
#comments-end
-------------------------------------
#cs
;#cs
;#ce
#ce u u u u
#cs
;#cs
;#ce
#ce u u u u
#cs
;#cs
;#ce
#ce u u u u
#cs
;#cs
;#ce
#ce
#cs
;#cs
;#ce
#ce i
#cs
;#cs
;#ce
#ce i
#cs
;#cs
;#ce
#ce i
-------------------------------------
#cs,test
...
#cs...
.#cs.. NE_PAS_CAPTURER
#ceNE_PAS_CAPTURER
...
#ce
#ce
#ce
-------------------------------------
#cs
#ce
#comments-start
...
#
#cs
#cs
...
#cs---
...
#
# ce NE_PAS_CAPTURER
#ce
#ce
#ce
#ce
#ce
...
-------------------------------------
--------- [NE PAS CAPTURER] ---------
#ce
#ce
#ce
#cs
#cs
#cs
#cs
#cs
#cs
"
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for SED, please visit: https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html