# If you'd like to omit non-matching lines from the result; add ';d' to the end of the expression.
sed -E 's/(<Group id="\d+">\n\t\t\t<Name>)(\w+)_(\w+)(<\\/Name>\n\t\t\t<Description>)([\w+\s]+)\s-\s([\w+\s]+)(<\\/Description>)/$1$3_$2$4$6 - $5$7/gm;t' <<< " <Group id=\"100\">
<Name>generalAlarm_Group01</Name>
<Description>Group General Alarm 01</Description>
<Type>poll</Type>
<Content multipleGet=\"true\">
<Param>100</Param>
<Param>101</Param>
<Param>103</Param>
<Param>104</Param>
<Param>120</Param>
<Param>121</Param>
</Content>
</Group>
<Group id=\"110\">
<Name>generalConfig_Group01</Name>
<Description>Group General Config 01</Description>
<Type>poll</Type>
<Content multipleGet=\"true\">
<Param>105</Param>
<Param>106</Param>
<Param>107</Param>
<Param>108</Param>
<Param>109</Param>
<Param>110</Param>
<Param>111</Param>
<Param>112</Param>
<Param>113</Param>
</Content>
</Group>
<Group id=\"1000\">
<Name>firstPriorityAlarmConfig_Group1000</Name>
<Description>First Priority Alarm Config Table - Group 1000</Description>
<Type>poll</Type>
<Content multipleGet=\"true\">
<Param>1000</Param>
</Content>
</Group>
<Group id=\"2000\">
<Name>secondPriorityAlarmConfig_Group2000</Name>
<Description>Second Priority Alarm Config Table - Group 2000</Description>
<Type>poll</Type>
<Content multipleGet=\"true\">
<Param>2000</Param>
</Content>
</Group>
<Group id=\"3000\">
<Name>thirdPriorityAlarmConfig_Group3000</Name>
<Description>Third Priority Alarm Config Table - Group 3000</Description>
<Type>poll</Type>
<Content multipleGet=\"true\">
<Param>3000</Param>
</Content>
</Group>"
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