2013-09-27 3 views
2

Мне нужно заменить несколько строк в xml-файле, используя sed. вот мой входной файл:sed заменить несколько тегов xml

<firstTag>Y</firstTag> 
<secondTag/> 

Я хочу, чтобы заменить эти строки в формате ниже:

<firstTag></firstTag> 
<secondTag>Y</secondTag> 

Я попытался с помощью этой команды:

sed -i -r "s#<firstTag>Y</firstTag>\n.*#<firstTag></firstTag>\n<secondTag>Y</secondTag>#g" input.txt 

Но это не работает. Я также замечаю, что перед вторым типом есть вкладка (^ я использую меньше команды). Будет ли это влиять на команду sed? Пожалуйста, помогите мне об этом.

Обновление: Есть несколько из secondTag вхождения в файле, и я только хочу, чтобы изменить значение secondTag на Y только после того, как найти, что предыдущее значение firstTag является Y. Например, если в input.txt:

<firstTag>Y</firstTag> 
<secondTag/> 
<firstTag/> 
<secondTag/> 

Я хочу, чтобы заменить на:

<firstTag></firstTag> 
<secondTag>Y</secondTag> 
<firstTag/> 
<secondTag/> 

ответ

1

Вы можете попробовать это sed:

sed -r '/<firstTag>.*<\/firstTag>/{N;s#(<firstTag>)(.*)((</firstTag>\n)<secondTag/>)#\1\4<secondTag>\2</secondTag>#g}' file.txt 
+0

Это дает неправильный '' правильный запрос '' – Jotne

+0

Спасибо. Обновлен мой ответ. – sat

0

насчет разделяющей две замены тегов?

sed -i -r -e "s#<firstTag>Y</firstTag>#<firstTag></firstTag>#" -e "s#<secondTag/>#<secondTag>Y</secondTag>#" input.txt 
+0

извините, я забыл упомянуть, что Есть несколько вхождение в secondTag и я только хочу, чтобы изменить значение secondTag на Y только после этого обнаружить, что предыдущее значение firstTag is Y. –

1

Использование awk вы можете сделать это:

awk -F"[<>/]" '/^<firstTag>/ {f=$3;$0="<"$2"></"$2">"} /^<secondTag\/>/ {$0="<"$2">" f "</"$2">"}1' file 
<firstTag><firstTag/> 
<secondTag>Y</secondTag> 

Что касается этого комментария:

извините, я забыл упомянуть, что Есть несколько вхождения в secondTag и я хочу только измените значение второгоTag на Y только после того, как оно обнаружит, что предыдущее значение firstTag равно Y

Вот еще awk, что только изменить первый secondTag если есть firstTag, игнорировать все остальные:

cat file 
<secondTag/> 
<firstTag>Y</firstTag> 
<secondTag/> 
<someOtherTag> 
<secondTag/> 

awk

awk -F"[<>/]" '/^<firstTag>/ {f=$3;$0="<"$2"></"$2">"} f && /^<secondTag\/>/ {$0="<"$2">" f "</"$2">";f=""}1' file 
<secondTag/> 
<firstTag></firstTag> 
<secondTag>Y</secondTag> 
<someOtherTag> 
<secondTag/> 
2

Это может работать для вас (GNU СЭД):

sed -r '$!N;s|^(<firstTag>)Y(</firstTag>\n<(secondTag))/>$|\1\2>Y</\3>|;P;D' file 
Смежные вопросы