Как заменить 1-й блок текста соответствия на sed? - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь заменить 1-й блок текста соответствия на sed.Рассмотрим этот пример.

read -r -d '' VAR <<"EOF"
<Button3d
some text
some text
/>

<Button3d
some text
some text
/>
EOF

sed '1,/^<Button3d/,/^\/>/c {
</Button\
different text\
different text\
/>\
}' <<< $VAR

Но с GNU sed я получаю следующую ошибку:

sed: -e выражение # 1, символ 15: неизвестная команда: `, '

Ожидаемый результат должен быть следующим:

<Button
different text
different text
/>

<Button3d
some text
some text
/>

Некоторые предлагают использовать синтаксический анализатор XML, однако для этого простого примера это будет полным излишним.

1 Ответ

0 голосов
/ 05 апреля 2019

Когда ваш sed поддерживает -z, вы можете использовать что-то вроде

sed -z 's#/>#\r#g; s/<Button3d[^\r]*\r//; s#\r#/>#g' <<< "${VAR}"

РЕДАКТИРОВАТЬ: Другой текст может быть вставлен с

sed -z 's#/>#\r#g; s/<Button3d[^\r]*\r/<Button3d\nOther text\nSecond line\n\r/; s#\r#/>#g' <<< "${VAR}"
...