Changing array of data by sed

Hi all,
Hope you are fine all

I want to change a certain field in specific array for example I got a file like below:

<alarmsend>yes</alarmsend>
<server>Hajk</server>
<type>5</type>
<alarmsend>yes</alarmsend>
<server>Hajk</server>
<type>1</type>
<alarmsend>yes</alarmsend>
<server>Hajk</server>
<type>3</type>
<alarmsend>yes</alarmsend>
<server>Hajk</server>
<type>5</type>

So I want to change alarm send to No for all type 5 for example to get out put as below

<alarmsend>no</alarmsend>
<server>Hajk</server>
<type>5</type>
<alarmsend>yes</alarmsend>
<server>Hajk</server>
<type>1</type>
<alarmsend>yes</alarmsend>
<server>Hajk</server>
<type>3</type>
<alarmsend>no</alarmsend>
<server>Hajk</server>
<type>5</type>

Thanks in advance

1 Like

Hello teefa14,

On UNIX.com we encourage users to do add their efforts which they have put in order to solve their own problems, so kindly do add the same(in form of code in CODE TAGS) in your question and let us know then.

Thanks,
R. Singh

What I've used but not working fine

cat source | awk 'BEGIN {line=""} {if( $0 ~ /<\/alarmsend>/ ){line=line""$0;print line ;line =""} else {line=line""$0"@@"}}'  | grep <type>5</type>| sed -e 's#<alarmsend>"yes"#<alarmsend>"no"#' | tr "@@" "\n"  | grep "<" > file

And another one with grep -v then append both
That's it so I want to see another one but from another prospective

1 Like

First thing to do is: get rid of syntax errors in your code.

For your problem, try

tac file | awk '/<type>5/ {T5 = 1} /<alarmsend/ && T5 {sub (/yes/, "no"); T5 = 0} 1' | tac
<alarmsend>no</alarmsend>
<server>Hajk</server>
<type>5</type>
<alarmsend>yes</alarmsend>
<server>Hajk</server>
<type>1</type>
<alarmsend>yes</alarmsend>
<server>Hajk</server>
<type>3</type>
<alarmsend>no</alarmsend>
<server>Hajk</server>
<type>5</type>
1 Like

Thanks alot

sed 'N;N;/5/ s/yes/no/' file
sed '/^<alarmsend/{N;N;\%5</type>$% s/yes/no/}' file

--- Post updated at 13:44 ---

If you complicate the task as much as possible

sed -r '/^<alarm/ {:1;N;\%</type>$%!b1}; s%^(<alarmsend>)yes(.*5</type>$)%\1no\2%' file
2 Likes

Thanks alot