Вам нужна функция regexp_replace()
с отрицательным прогнозом , например:
# select replace(e'aaa\naaa bbb', 'aaa', 'aaa bbb');
┌─────────────┐
│ replace │
├─────────────┤
│ aaa bbb ↵│
│ aaa bbb bbb │
└─────────────┘
# select regexp_replace(e'aaa\naaa bbb', 'aaa(\s+)(?!bbb)', 'aaa bbb\1', 'g');
┌────────────────┐
│ regexp_replace │
├────────────────┤
│ aaa bbb ↵│
│ aaa bbb │
└────────────────┘
Использование ваших данных:
# select regexp_replace(
'<Item><Name>First</Name>
<Subject>x:y. Food: Apple. x:y. </Subject>
</Item>
<Item><Name>Second</Name>
<Subject>x:y. x:y. Food: Apple. Type: Red. x:y. x:y.</Subject>
</Item>
<Item><Name>Third</Name>
<Subject>x:y. Food: Apple. x:y. </Subject>
</Item>',
'Food: Apple\.(\s+)(?!Type: Red\.)',
'Food: Apple. Type: Red.\1', 'g');
┌─────────────────────────────────────────────────────────────────────┐
│ regexp_replace │
├─────────────────────────────────────────────────────────────────────┤
│ <Item>\n<Name>First</Name> ↵│
│ <Subject>x:y. Food: Apple. Type: Red. x:y. </Subject> ↵│
│ </Item> ↵│
│ <Item>\n<Name>Second</Name> ↵│
│ <Subject>x:y. x:y. Food: Apple. Type: Red. x:y. x:y.</Subject>↵│
│ </Item> ↵│
│ <Item>\n<Name>Third</Name> ↵│
│ <Subject>x:y. Food: Apple. Type: Red. x:y. </Subject> ↵│
│ </Item> │
└─────────────────────────────────────────────────────────────────────┘
Обновление: как заменить текст только для определенных элементов:
with t(x) as (values('<Item><Name>First</Name>
<Subject>x:y. Food: Apple. x:y. </Subject>
</Item>
<Item><Name>Second</Name>
<Subject>x:y. x:y. Food: Apple. Type: Red. x:y. x:y.</Subject>
</Item>
<Item><Name>Third</Name>
<Subject>x:y. Food: Apple. x:y. </Subject>
</Item>'))
select
string_agg(
case
when xx like any(array['%<Name>Third</Name>%','%<Name>Second</Name>%']) then
regexp_replace(xx, 'Food: Apple\.(\s+)(?!Type: Red\.)', 'Food: Apple. Type: Red.\1', 'g')
else xx
end || '</Item>', e'\n')
from t, unnest(string_to_array(replace(x, e'\n', ''), '</Item>')) as xx
where xx <> '';
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ string_agg │
├───────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ <Item><Name>First</Name> <Subject>x:y. Food: Apple. x:y. </Subject> </Item> ↵│
│ <Item><Name>Second</Name> <Subject>x:y. x:y. Food: Apple. Type: Red. x:y. x:y.</Subject> </Item>↵│
│ <Item><Name>Third</Name> <Subject>x:y. Food: Apple. Type: Red. x:y. </Subject> </Item> │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────┘