Безопаснее способ извлечь номер версии будет интерпретировать сам тег поля, rathe r, чем просто расщепляются кавычками.
$ sed -nr 'H;${;x;s/.*<field[^>]+name="cd_version"[^>]+defaultValue="([0-9.]+)"[^>]*\/>.*/\1/;p;}' input.txt
14.8.21.1
Вы можете поставить версию в переменной, используя обозначения, вы уже знакомы с:
$ v=$(sed -nr 'H;${;x;s/.*<field[^>]+name="cd_version"[^>]+defaultValue="([0-9.]+)"[^>]*\/>.*/\1/;p;}' input.txt)
$ echo $v
14.8.21.1
Это СЭД сценарий, возможно, имеет какое-то объяснение ...
H;
- добавить «текущая» линия до «удерживаемого пространства» sed
${;
- как только мы нажмем последнюю строку, сделайте следующее. ..
x;
- ОБМЕН трюмного пространства для шаблона (так что мы можем работать над этим),
s/.*<field...([0-9.]+)...\/>.*/\1/;
- извлечь defaultValue
из правильного поля,
p;}
- и распечатать результат.
Это должно быть безопасным для случаев, когда появляются множественные <field>
s на одной линии (до тех пор, пока есть только один cd_version), или где атрибуты <field>
разделены на несколько строк.
Обратите внимание, что это ЭТО, и вы, вероятно, должны использовать инструменты, которые действительно правильно интерпретируют поля. Широко распространено мнение, что you cannot parse HTML with regex, и те же рассуждения применимы и к другим SGML.
Как только у вас есть , вы получите номер версии, вы можете использовать sed -i
, чтобы заменить его.
$ newver="foobar"
$ grep -o 'defaultValue="[^"]*"' input.txt
defaultValue="14.8.21.1"
$ sed -i '' 's/defaultValue="14.8.21.1"/defaultValue="'"${newver}"'"/' input.txt
$ grep -o 'defaultValue="[^"]*"' input.txt
defaultValue="foobar"
Обратите внимание, что я использую FreeBSD, чьи sed
могут вести себя по-разному от одного в операционной системе, которую вы используете. Даже если это работает, вы, вероятно, должны прочитать документацию для каждого инструмента и опции, используемой здесь, чтобы убедиться, что вы понимаете, почему она делает то, что она делает. В частности, замена regex я использовал для упрощения чтения.Чтобы быть в безопасности, вы должны развернуть его так же, как он был расширен в начальном сценарии sed, который нашел номер версии, так что вы не меняете defaultValue
для других полей, кроме cd_version
.
Я спросил, потому что я собрал больше информации, и мой первоначальный вопрос был откат. –
Да, я только что видел это. Однако вы не задаете новый вопрос здесь. Вы задаете один и тот же вопрос, так как это оригинальная комбинация 'grep' /' awk'. –
Почему бы не использовать sed? – tvm