Назад | Перейти на главную страницу

Извлекать текст между двумя строками, только если присутствует другая строка

У меня есть большой XML-файл, который я пытаюсь изменить только в определенных строках. Все строки, которые я хочу изменить, будут содержаться в них. В этих строках я хочу иметь только текст между двумя строками (в данном случае это строки / и). Итак, скажем, у меня есть это в текстовом файле:

<title>xxxxxxxxx / xxx</title>
<sys>yyyyyyyyy</sys>
<name>test / extra text</name>
<date>zzzzzzzzz</date>

Я хочу изменить его, чтобы получить следующее:

<title>xxxxxxxxx / xxx</title>
<sys>yyyyyyyyy</sys>
<name>test</name>
<date>zzzzzzzzz</date>

Можно ли этого добиться с помощью awk или sed?

Используйте синтаксический анализатор XML для анализа данных XML.

# get the current value:
current=$(xmlstarlet sel --template --value-of "//name" file.xml)
# update the value
xmlstarlet ed --inplace --update "//name" --value "${current% /*}" file.xml

Это должно работать:

sed 's:<name>test / extra text</name>:<name>test</name>:' file.xml

Или для замены на месте добавьте -i:

sed -i 's:<name>test / extra text</name>:<name>test</name>:' file.xml