How can I extract XML block around matching search string?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How can I extract XML block around matching search string?
# 15  
Old 02-14-2016
Quote:
Originally Posted by kchinnam
Don, I need to assign XML output to a variable. Assigning functions output to a variable causes output to loose newlines

Code:
#!/bin/bash
_getXMLblock()
{
strear='myapp1-ear'

ed -s xmlfile.xml <<EOF
1,/<\/notify-list>/p
g/<application-name>$strear<\/application-name>/?<application>?,/<\/application>/p
$ p
q
EOF
}

strXML=${_getXMLblock}
echo $strXML

# how can I retain line breaks in this method?
The function isn't throwing away line breaks. The shell is throwing away the line breaks in your echo statement because you didn't quote the expansion of the variable that was assigned the output from the function. Change:
Code:
echo $strXML

to:
Code:
echo "$strXML"

or, more safely:
Code:
printf '%s\n' "$strXML"

Quote:
Code:
<?xml version="1.0" encoding="UTF-8"?> <deployment-request> <requestor> <first-name>kchinnam</first-name> <last-name>Group</last-name> <email-address>kchinnam@some.com</email-address> </requestor> <notify-list> <email-address>kchinnam@some.com</email-address> </notify-list> <application> <application-name>myapp1-ear</application-name> <ear-file-name>myapp1-ear.ear</ear-file-name> <edition/> <shared-library-name/> </application> </deployment-request>

This method keeps line breaks. But how can I use multiple statements?

Code:
#!/bin/bash
strear='meta-ear';

foundXML=$(ed -s xmlfile.xml <<< "1,/<\/notify-list>/p; g/<application-name>$strear<\/application-name>/?<application>?,/<\/application>/p; $ p")

echo $foundXML

output

Code:
?
foundXML[]

No, this will not preserve line breaks any more than the earlier attempt. You still have an unquoted expansion of a variable containing line breaks.

And, as you have found, you can't combine ed statements on a single line using semi-colon as a command separator.

But:
Code:
#!/bin/bash
strear='meta-ear';

foundXML=$(ed -s xmlfile.xml <<< "1,/<\/notify-list>/p
g/<application-name>$strear<\/application-name>/?<application>?,/<\/application>/p
$ p")

printf '%s\n' "$foundXML"

should work. The first form is more portable and will work on any shell that performs POSIX-standard command substitutions and variable expansions.

The last form only works with recent versions of bash, ksh, and a few other shells supporting the <<< string redirection operator extension to the standards.
# 16  
Old 02-14-2016
Don, you are right. Below solution is working,,

Code:
foundXML=$(ed -s xmlfile.xml <<< "1,/<\/notify-list>/p
g/<application-name>$strear<\/application-name>/?<application>?,/<\/application>/p
$ p")

I will go with function. searching for ed related info on google has very little.
Looks like you are the last remaining expert,, I loved what it can do.

Last edited by kchinnam; 02-14-2016 at 05:41 PM.. Reason: update
# 17  
Old 02-14-2016
Quote:
Originally Posted by kchinnam
I could not edit my previous post for some reason.. can someone fix that?
I am able to preserve new lines with this:
Code:
echo "$strXML"

Moderator's Comments:
Mod Comment There shouldn't be any reason why you could not edit your own post.

Maybe you just didn't see the Edit button close to the bottom right corner of the post you wanted to edit because the post is so wide???
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Extract XML block when value is matched (Shell script)

Hi everyone, So i'm struggling with an xml (log file) where we get information about some devices, so the logfile is filled with multiple "blocks" like that. Based on the <devId> i want to extract this part of the xml file. If possible I want it to have an script for this, cause we'll use... (5 Replies)
Discussion started by: Pouky
5 Replies

2. Shell Programming and Scripting

Extract all text between the same matching string from a given column

Hello All, I have an input sample data like below (In actual I have many columns and few million rows). Column1,Column2 4,2 1,5 Hello,4 1,4 Hello,2 3,5 Hello,8 4,5 Need the output (using awk and/or sed preferably) like below. Here I need all the lines between 2 matching... (1 Reply)
Discussion started by: ks_reddy
1 Replies

3. Shell Programming and Scripting

Search String and extract few lines under the searched string

Need Assistance in shell programming... I have a huge file which has multiple stations and i wanted to search particular station and extract few lines from it and the rest is not needed Bold letters are the stations . The whole file has multiple stations . Below example i wanted to search... (4 Replies)
Discussion started by: ajayram_arya
4 Replies

4. Shell Programming and Scripting

Extract First and matching word from string in UNIX

Thank you (2 Replies)
Discussion started by: Pratik Majithia
2 Replies

5. Shell Programming and Scripting

To extract a string between two words in XML file

i need to extract the string between two tags, input file is <PersonInfoShipTo AddressID="446311709" AddressLine1="" AddressLine2="" AddressLine3="" AddressLine4="" AddressLine5="" AddressLine6="" AlternateEmailID="" Beeper="" City="" Company="" Country="" DayFaxNo="" DayPhone="" Department=""... (5 Replies)
Discussion started by: Padmanabhan
5 Replies

6. Shell Programming and Scripting

Extract string from XML

Hi, I wish to grep for the first instance of <listen-address> value between the first <server></server> tag in an xml file. Sample xml: ......... <timeout-seconds>1500</timeout-seconds> </jta> <server> <name>Adminserver_DEV</name> ... (9 Replies)
Discussion started by: mohtashims
9 Replies

7. Shell Programming and Scripting

XML - Split And Extract String between Chars

Hi, I am trying to read the records from file and split into multiple files. SourceFile.txt <?xml version="1.0" encoding="UTF-8"?>... (2 Replies)
Discussion started by: unme
2 Replies

8. UNIX for Dummies Questions & Answers

Search and extract matching patterns

%%%%% (9 Replies)
Discussion started by: lucasvs
9 Replies

9. Shell Programming and Scripting

Extract selective block from XML file

Hi, There's an xml file produced from a front-end tool as shown below: <INPUT DATABASE ="ORACLE" DBNAME ="UNIX" NAME ="FACT_TABLE" OWNERNAME ="DIPS"> <INPUTFIELD DATATYPE ="double" DEFAULTVALUE ="" DESCRIPTION ="" NAME ="STORE_KEY" PICTURETEXT ="" PORTTYPE ="INPUT" PRECISION ="15" SCALE... (6 Replies)
Discussion started by: dips_ag
6 Replies

10. Shell Programming and Scripting

Search for string in a file and extract another string to a variable

Hi, guys. I have one question: I need to search for a string in a file, and then extract another string from the file and assign it to a variable. For example: the contents of the file (group) is below: ... ftp:x:23: mail:x:34 ... testing:x:2001 sales:x:2002 development:x:2003 ...... (6 Replies)
Discussion started by: daikeyang
6 Replies
Login or Register to Ask a Question