2014-09-18 2 views
-1

У меня есть следующие строки в моем файлеBASH GREP И AWK внутри ПЕРЕМЕННОЙ

<field name="cd_version" type="string" size="16" id="-1" sequence="1" defaultValue="14.8.21.1"/> 

Я пытается захватить и обновить номер версии 14.8.21.1

И.Е.

bash-3.2$ grep cd_version market_rules_cd.reader.xml | awk -F '"' '{print $12}' 
14.8.21.1 

Скрипт пытается повторить текущую версию и заменить его на входе пользователя

# Finds the version number in the file and changes it 
#!/bin/bash 
# 2014 

# 
# Usage: ./versionupdate <file> 
# 
# Arguments: 
# 1. File name to have the version number replaced 
# 
# Finds the version number in the file and changes it 
# to the one specified at the prompt. 

FNAME=$1 
echo $OLD_NO 
#Get the version of the 
OLD_NO=$(grep "_version=" | awk -F '"' '{print $12}' $FNAME) 
echo "What do you want to update release number to?" 
REPLACEMENT="_version="$NEW_NO 
echo $REPLACEMENT 
sed -i ''s/$OLD_NO/$REPLACEMENT/g'' $FNAME 

~ ~

Это, кажется, висит здесь

OLD_NO=$(grep "_version=" | awk -F '"' '{print $12}' $FNAME) 
+0

Я спросил, потому что я собрал больше информации, и мой первоначальный вопрос был откат. –

+2

Да, я только что видел это. Однако вы не задаете новый вопрос здесь. Вы задаете один и тот же вопрос, так как это оригинальная комбинация 'grep' /' awk'. –

+0

Почему бы не использовать sed? – tvm

ответ

0

Безопаснее способ извлечь номер версии будет интерпретировать сам тег поля, 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.

Смежные вопросы