Команда sed, чтобы заменить текст из некоторой позиции поиска - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу заменить значение 2000 на 5000 для фруктового винограда.Как использовать sed, чтобы начать поиск с позиции «виноград» и заменить первое вхождение

<fruits>
   <fruit>
        <name>apple</name>
        <value>2000</value>
   </fruit>
   <fruit>
        <name>grapes</name>
        <value>2000</value>
   </fruit>
   <fruit>
        <name>banana</name>
        <value>2000</value>
   </fruit>
</fruits>

Я пробовал

sed '\,grapes, s/2000/5000/' fruits.txt

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Использование xmlstarlet:

xmlstarlet ed -u "//fruits/fruit/name[.='grapes']/following-sibling::value" -v 5000 fruits.xml

Это обновит (ed -u) xml, выбрав xpath //fruits/fruit/name, где name равно grapes, а following-sibling равно value, изменив содержимое на 5000.

0 голосов
/ 18 сентября 2018

sed - для выполнения s / old / new , что все .Для всего остального вы должны использовать awk:

$ awk '/grapes/{f=1} f && sub(/2000/,"5000"){f=0} 1' file
<fruits>
   <fruit>
        <name>apple</name>
        <value>2000</value>
   </fruit>
   <fruit>
        <name>grapes</name>
        <value>5000</value>
   </fruit>
   <fruit>
        <name>banana</name>
        <value>2000</value>
   </fruit>
</fruits>
0 голосов
/ 18 сентября 2018
sed -i '\%<name>grapes</name>%,\%</fruit>%s%<value>2000</value>%<value>5000</value>%' fruits.xml

Мы используем обобщенный \%, чтобы избежать необходимости использовать обратную косую черту в закрывающих тегах. s%%% не нуждается в обратном слэше, потому что sed уже знает, что после s есть разделитель.

На * BSDish-платформах, включая MacOS, вам нужен явный аргумент пустой строки для sed -i перед самим сценарием (поэтому sed -i '' '\%...')

Это пытается быть строгим, но, конечно, не может справиться со всеми возможными вариациями, которые синтаксически разрешены в XML. Если ваш файл всегда в точно ожидаемом формате, это должно работать на данный момент. Одним из недостатков является то, что вы не получите предупреждения, когда он перестанет работать, потому что Дженкинс решает начать использовать пробелы внутри тегов или что-то еще.

...