2013-09-26 2 views
1

У меня есть файл вроде этого. abc.txtнайти и заменить значение внутри тегов, используя скрипт

<ra><r>12.34</r><e>235</e><a>34.908</a><r>23</r><a>234.09</a><p>234</p><a>23</a></ra> 
<hello>sadfaf</hello> 
<hi>hiisadf</hi> 
<ra><s>asdf</s><qw>345</qw><a>345</a><po>234</po><a>345</a></ra> 

Что я должен сделать, это я должен найти <ra> тег и внутри <ra> тега есть <a> тег которого valeus я должен заменить 0.00.

grep "<ra>" "abc.txt" | grep "<a>" 

Я в состоянии найти, но я не знаю, как это изменить.

Выходной файл для этого: -

<ra><r>12.34</r><e>235</e><a>0.00</a><r>23</r><a>0.00</a><p>234</p><a>0.00</a></ra> 
<hello>sadfaf</hello> 
<hi>hiisadf</hi> 
<ra><s>asdf</s><qw>345</qw><a>0.00</a><po>234</po><a>0.00</a></ra> 

ответ

2

Это СЭД должна работать:

sed -i.bak '/<ra>/s~\(<a>\)[^<]*\(</a>\)~\10.00\2~g' abc.txt 
<ra><r>12.34</r><e>235</e><a>0.00</a><r>23</r><a>0.00</a><p>234</p><a>0.00</a></ra> 
<hello>sadfaf</hello> 
<hi>hiisadf</hi> 
<ra><s>asdf</s><qw>345</qw><a>0.00</a><po>234</po><a>0.00</a></ra> 

Из-за -i (встроенный) переключатель это СЭД сохранит изменения в самом исходном файле.

+0

Благодарим вас за ответ, объясните ли вы работу скрипта. – avinashse

+0

'/ /' находит все строки с '' в них, а затем заменяет 's ~ \ ( \) [^ <]*\( \) ~ \ 10.00 \ 2 ~ g' команда выполняется в найденных строках. Команда substitute находит текст от '' до '' и заменяет его на' 0,00 '(используя сопоставленные группы # 1 и # 2). – anubhava

2

Вы можете попробовать следующий код:

$ sed -e '/<ra>/ s#<a>[^<]*<#<a>0.00<#g' file 
<ra><r>12.34</r><e>235</e><a>0.00</a><r>23</r><a>0.00</a><p>234</p><a>0.00</a></ra> 
<hello>sadfaf</hello> 
<hi>hiisadf</hi> 
<ra><s>asdf</s><qw>345</qw><a>0.00</a><po>234</po><a>0.00</a></ra> 

Он основан на этой структуре:

Print # in lines starting with BBB just if there was not ^# before 
sed -e '/^BBB/ s/^#*/#/' -i file 

изменяя разделитель a #, поэтому нам не нужно избегать / в </a>.

Обратите внимание, что если вы хотите, чтобы файл был обновлен, вам нужно добавить -i в sed (sed -i -e ...). В противном случае результат будет напечатан в стандартном режиме.

+0

Вы не не нужен окончательный '/ а>', начало '<' достаточно, как: 'SED -e«/ /s # [^ <]*<# 0.00 <# g'' – Jotne

+1

Это хороший момент, @ Джот. Тем не менее, я добавил '', так что такие случаи, как ' hello , как вы можете использовать? То есть, чтобы другие теги находились внутри' '/' '. Во всяком случае, я вижу, что это не делает это должным образом, поэтому я буду использовать выражение, которое вы предлагаете. Благодаря! – fedorqui

+1

Вы тоже хорошо знаете, забыл, что могут быть и другие теги, такие как полужирный. – Jotne

3

Заменить с помощью awk и gsub

awk '/^<ra>/ {gsub(/<a>[^<]*</,"<a>0.00<")}1' file 
<ra><r>12.34</r><e>235</e><a>0.00</a><r>23</r><a>0.00</a><p>234</p><a>0.00</a></ra> 
<hello>sadfaf</hello> 
<hi>hiisadf</hi> 
<ra><s>asdf</s><qw>345</qw><a>0.00</a><po>234</po><a>0.00</a></ra> 
Смежные вопросы