Domanda

I have never been able to find out how, when using 'sed', to limit changing the character case of a particular buffered output. For example, in the following 'sed' command I have two selected two spans of text to save as buffers to re-use during substition:

sed -ri 's/^<div class="line" data-line-mode="verse"><span class="speaker"[^>]*>([^<]*)<\/span>[ ]*(.*)[ ]*$/<p class="psi"><font size="-1" color="green"><b>\U\1<\/b>:<\/font><br>\n\2<br>/' "$f"

The desired output then is:

<p class="psi"><font size="-1" color="green"><b>FIRST_BUFFER_OUTPUT_ALL_UPPERCASE<\/b>:<\/font><br>\nSecond_buffer_output_originalCase<br>

But what I always end up with is:

<p class="psi"><font size="-1" color="green"><b>FIRST_BUFFER_OUTPUT_ALL_UPPERCASE<\/B>:<\/FONT><BR>\nSECOND_BUFFER_OUTPUT_ORIGINALCASE<BR>

So everything after the '\U\1' in the command gets its case altered to UPPERCASE, including tag chars. Is there a way to limit '\U\1' to altering only the contents of buffer '\1' to UPPERCASE, leaving everything else as typed?

È stato utile?

Soluzione

From this answer, try \E to stop case conversion started by \L or \U:

sed -ri 's/^...$/...\U\1\E<\/b>:<\/font><br>\n\2<br>/' "$f"
                         ^^
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top