Regex: Помогите с извлечением поля из текста и заменой значения поля - PullRequest
2 голосов
/ 27 августа 2010

Мне нужно извлечь параметр из файла конфигурации и заменить его значения другим заданным значением.Файл конфигурации:

<host ip="200.200.200.200" name="testhost" description="test server" type="TEST_Duplex " connection="xmlrpc" xmldefaulttimeout="2.0" xmlspecifictimeout ="8.0"/>

Я должен заменить значение xmldefaulttimeout="2.0" другим значением, например: xmldefaulttimeout="4.0".

Как в тексте, xmldefaulttimeout = "2.0", но на самом деле значение" 2.0 "не является достоверным.Это может быть еще одно неопределенное значение.Поэтому я должен получить значение xmldefaulttimeout и заменить его другим заданным значением (например, 4.0).

Я думаю, что должен использовать sed или awk.Но мне жаль, что мои проверенные команды не могут этого понять.Кто-нибудь может мне помочь с этим?Спасибо!Извините, я только начал изучать оболочку: -)

Ответы [ 2 ]

1 голос
/ 27 августа 2010

Баш 3.2 +

#!/bin/bash   

new='xmldefaulttimeout="4.0"'
exec 4<"file"
while read -r line <&4
do
  case "$line" in
   *"xmldefaulttimeout="*)
     [[ $line =~ "(.*)(xmldefaulttimeout=\".[^ \t]*\")(.*)" ]]
     echo ${BASH_REMATCH[1]}${new}${BASH_REMATCH[3]}
      ;;
  esac
done
exec 4<&-
1 голос
/ 27 августа 2010
input='<host ip="200.200.200.200" name="testhost" description="test server" type="TEST_Duplex " connection="xmlrpc" xmldefaulttimeout="2.0" xmlspecifictimeout ="8.0"/'

new_value='xmldefaulttimeout="4.0"'

echo $input | sed "s/xmldefaulttimeout=\"[0-9.]*\"/$new_value/"

Чтобы соответствовать любому значению xmldefaulttimeout, вам нужно использовать регулярное выражение: xmldefaulttimeout=\"[0-9.]*\"

  • xmldefaulttimeout=: буквально совпадать
  • \": додля совпадения с литералом ", вам нужно экранировать ", чтобы предотвратить преждевременное завершение шаблона.
  • [0-9.]: класс Char для совпадения с любой цифрой или точкой
  • *: ноль или более от предыдущего символа.
...