2014-11-13 3 views
0

У меня есть hdfs-site.xml файл, который содержит следующую информациюСЕПГ регулярное выражение заменяет весь файл

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 

<!-- Put site-specific property overrides in this file. --> 

<configuration> 
    <property> 
     <name>dfs.replication</name> 
     <value>3</value> 
    </property> 
    <property> 
     <name>dfs.name.dir</name> 
     <value>/data/dfs/nn</value> 
    </property> 
    <property> 
     <name>dfs.data.dir</name> 
     <value>/data/dfs/dn,/mnt_test_volume/data/dfs/dn,/mnt_test_volume/data/dfs/dni,/mnt_test_v5olume/data/dfs/dn,/mnt_test_volume/d5ata/dfs/dgn</value> 
    </property> 
    <property> 
     <name>dfs.permissions</name> 
     <value>false</value> 
    </property> 
</configuration> 

Я хочу, чтобы удалить некоторые из записей, присутствующих в <name>dfs.data.dir</name><value> и </value></name> тегов. Какая запись для удаления определяется одним параметром для сценария оболочки.

Я новичок в sed, и я написал следующую команду sed, чтобы найти конкретную запись и удалить ее. Это работает так, как ожидалось, когда sed выполняется в первый раз, но когда такая же команда выполняется в следующий раз, все содержимое файла уничтожается, а файл становится пустым.

sed -ni '1h; 1!H; ${g; s#\(<name>dfs\.data\.dir<\/name>[^a-zA-Z0-9]*<value>.*\)'$data_dir_path'[^,<]\(.*<\/value>\)#\1\2# p}' hdfs-site.xml 

В этой переменной команда $data_dir_path решает, какая запись будет удалена.

Например, если значение data_dir_path является /mnt_test_volume/data/dfs/dn то я ожидаю следующего вывода

<name>dfs.data.dir</name>   <value>/data/dfs/dn,,/mnt_test_volume/data/dfs/dni,/mnt_test_v5olume/data/dfs/dn,/mnt_test_volume/d5ata/dfs/dgn</value> 

, которая работает хорошо, когда команда выполняется один раз, но если же команда выполняется в следующий раз, весь файл становится пустым.

Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно здесь?

+1

'sed' - это неправильный инструмент для управления XML – anubhava

+0

использовать' awk' для определения и замены определенного выражения. – Skynet

+0

@anubhava, Каков надлежащий инструмент для обработки XML в сценарии оболочки? Я новичок в сценариях оболочки, поэтому я действительно не знаю подходящего инструмента для этого. – Shekhar

ответ

2

Вы можете использовать гораздо проще sed в

sed "/<name>dfs.data.dir<\/name>/ {n; s#$data_dir_path##}" hdfs-site.xml 

Что она делает?

  • -i Inplace редактирование файла

  • '/<name>dfs.data.dir<\/name>/ проверяет, является ли строка соответствует шаблону. Если да, то последующие команды исключаются. Следует отметить, что команды, следующие сгруппированы в {}, как {n; s/'$data_dir_path'//}'

  • n; считывает следующую строку из файла в области шаблона

  • s/'$data_dir_path'// substiture значение в $data_dir_path с null

Test

$ sed "/<name>dfs.data.dir<\/name>/ {n; s#$data_dir_path##}" test 

bash-3.2$ cat test 
: 
: 
: 
     <name>dfs.data.dir</name> 
     <value>/data/dfs/dn,,i,/mnt_test_v5olume/data/dfs/dn,/mnt_test_volume/d5ata/dfs/dgn</value> 
: 
: 
: 
+0

Спасибо за вашу помощь.Я выполнил вашу команду, но получаю сообщение «sed: -e expression # 1, char 53: unknown option to' s ». – Shekhar

+0

@Shekhar, вы уверены, что вы скопировали скрипт правильно. Потому что он отлично работает в моей системе:/ – nu11p01n73R

+0

Да, я скопировал вложенную команду как есть. Где-то я читал, что поведение sed изменяется в зависимости от типа используемой оболочки (bash, тире и т. Д.). Я получаю эту ошибку из-за различий в оболочке? или несоответствие версии версии, возможно? – Shekhar

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