2013-04-18 3 views
0

У меня есть файл конфигурации как hive-site.xmlСценарий справки об обнаружении и замене строк

Один элемент конфигурации;

<property> 
    <name>hadoop.embedded.local.mode</name> 
    <value>true</value> 
    </property> 

Я хочу изменить «true» на «false» с помощью сценария оболочки. Но в файле есть много элементов конфигурации, таких как;

<value>true</value> 

теги.

Так что команда «sed», которую я использовал для поиска и замены строк, трудно использовать здесь с моими знаниями. Цените, если кто-нибудь может мне помочь.

+1

Я предлагаю вам использовать правильный язык программирования с библиотекой разбора XML. – michaelb958

+0

Так вы говорите, что это невозможно сделать с помощью сценария оболочки? –

+0

Невозможно, но очень сложно. (У меня возникла бы серьезная проблема с анализом XML в сценарии оболочки.) – michaelb958

ответ

0

Вы можете передать весь блок и изменить его.

sed -i '/s/<property><name>hadoop.embedded.local.mode<\/name><value>true<\/value<\/property> 
/<property><name>hadoop.embedded.local.mode<\/name><value>false<\/value><\/property>/' 
hive-site.xml 
+0

Вам нужно избежать встроенных косых черт или использовать другой разделитель. И действительно ли работают многострочные замены? Я думал, что sed управляет строкой за раз. – Barmar

+0

да, правильно, нам нужно избегать слэшей и многострочных замен для меня –

1

Возможно, это работа для XPath и разумной библиотеки XML. Выполнение этого из сценария оболочки напрямую приведет к созданию сложного и, вероятно, хрупкого решения. Я собираюсь использовать python и популярный lxml библиотеки в качестве примера:

from lxml import etree 

tree = etree.fromstring(''' 
    <property> 
    <name>hadoop.embedded.local.mode</name> 
    <value>true</value> 
    </property> 
''') 

e = tree.xpath('//property[name="hadoop.embedded.local.mode"]/value')[0] 
e.text = 'false' 
print etree.tostring(tree) 

В принципе, который выбирает любой узел свойств (в любом месте в документе), если она содержит <name> элемента с этим значением, то он выбирает значение элемент. Затем вы можете изменить содержимое элемента по своему вкусу и снова напечатать в виде строки. XPath является стандартным, поэтому примерно такой же код должен работать и в других реализациях.

1

Очевидно, что существует несколько способов сделать это, но почему бы не попробовать awk (gawk)?

#!/bin/bash 

gawk \ 
'   
    BEGIN { 
     FLAG = 0; 
    } 

    /hadoop.embedded.local.mode/ { 
     FLAG = 1; 
    } 

    />[  ]*true[  ]*</ { 
     if (FLAG == 1) { 
      FLAG = 0 
      gsub("true", "false") 
     } 
    } 

    { 
     print 
    } 
' "[email protected]" 

Призовите выше сценарий как:

<script> hive-site.xml 
0

Если значение, которое вы хотите изменить, всегда на следующей строке вы можете сначала получить номер строки нужного элемента с

NUMBER=$(grep -n "<desired element>" filename | awk -F: '{print $1}') 

Затем приращение на следующей строке

let NUMBER="NUMBER + 1" 

Затем используйте sed или ex для изменения значения, я предпочитаю ex в этих случаях, так как это устраняет необходимость в промежуточном текстовом файле.

{ 
print "${NUMBER}s/true/false/" 
print "wq" 
} | ex filename 
Смежные вопросы