Extract code between 2 strings.


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Extract code between 2 strings.
# 1  
Old 05-30-2013
Extract code between 2 strings.

Hi,

Im having some problems with this. I have loaded a file with html code. All code is placed in the same line. I want to get everything between two given strings (including these strings and get only the first appearance).

Example:

File contains
Code:
<html><body><a href='a.html'>abc</a><a href='b.php'>dfd</a><</body></html>

Id like to get from string "<a href='a.html'>" to string "</a>"

The output would be:
Code:
<a href='a.html'>abc</a>

(as I said incluiding both strings and only first appareance)

I have tried several ways with sed but didnt succeed.

Thanks in advance

Last edited by ngb; 05-30-2013 at 05:46 PM..
# 2  
Old 05-30-2013
Try:
Code:
perl -nle '/<a.*?<\/a>/;print $&' file.html

# 3  
Old 05-30-2013
Please use code tags as required by forum rules!

Show your several ways with sed.
# 4  
Old 05-30-2013
Thanks. I will try with Perl. Ill let you know about it. Any option using sed?

To clear it up, string limits may be any string. Using the first example:

Code:
<html><body><a href='a.html'>abc</a><a href='b.php'>dfd</a><</body></html>

from "<a"
to ".php'"

Expected output:
Code:
<a href='a.html'>abc</a><a href='b.php'

Thanks
# 5  
Old 05-30-2013
I think a relatively complicated sed script could do this, but I'm getting lazy in my old age. It is fairly straight forward to do it with an awk script (as long as you aren't worried about case insensitive matching). Some implementations of awk provide a case insensitive search option, but it is not included in the standards (and isn't available on the OS X laptop I use when testing solutions for this forum). If that is a problem, the following script could be easily extended to convert the input tag variable to a case-insensitive regular expression in a BEGIN section action.

Is use the Korn shell, but the following will work with any POSIX conforming shell (such as bash and ksh). If you are using a Solaris/SunOS system, change the awk in this script to /usr/xpg4/bin/awk, /usr/xpg6/bin/awk, or nawk.
Code:
#!/bin/ksh
if [ $# -ne 2 ]
then    printf "Usage: %s tag file\n" "${0##*/}" >&2
        exit 1
fi
awk -v tag="$1" '
{       if(match($0, "</" tag ">")) $0 = substr($0, 1, RSTART + RLENGTH - 1)
        else printf("</%s> not found\n", tag)
        if(match($0, "<" tag "(>| ([^>])*>)")) $0 = substr($0, RSTART)
        else printf("<%s> not found\n", tag)
        print
}' "$2"

Save this script in a file (such as gettag), make it executable using:
Code:
chmod +x gettag

and invoke it with two operands (the 1st being the tag you want to extract, and the 2nd being the name of the file containing your html code line). Assuming that the html code in the 1st message in this thread is stored in a file named "File", the command:
Code:
./gettag a File

produces the output:
Code:
<a href='a.html'>abc</a>

The command:
Code:
./gettag body File

produces the output:
Code:
<body><a href='a.html'>abc</a><a href='b.php'>dfd</a><</body>

And, the command:
Code:
./gettag bod File

produces the output:
Code:
</bod> not found
<bod> not found
<html><body><a href='a.html'>abc</a><a href='b.php'>dfd</a><</body></html>

Note that awk and sed behavior is only defined by the standards when the input files they are processing are text files. So, if your single line html file is more than LINE_MAX bytes long, the results are unspecified. On standards conforming implementations, LINE_MAX can be as small as 2048. (You can find the value used on your system by running the command getconf LINE_MAX.)
# 6  
Old 05-31-2013
Try
Code:
$ sed -r 's#^.*(<a href=.a\.html.>[^<]*</a>).*$#\1#' file
<a href='a.html'>abc</a>

 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Extract strings from output

I am having the following output when executing a dig command : dig @1.1.1.1 google.com +noall +answer +stats ; <<>> DiG 9.11.4-P1 <<>> @1.1.1.1 google.com +noall +answer +stats ; (1 server found) ;; global options: +cmd obodrm.prod.at.dmdsdp.com. 86154 IN A ... (1 Reply)
Discussion started by: liviusbr
1 Replies

2. UNIX for Beginners Questions & Answers

Extract content between strings

Hello i am stuck with this. i have input which is as follows /type/work /works/OL10627594W 3 2019-04-24T16:46:21.351549 {"created": {"type": "/type/datetime", "value": "2009-12-11T03:18:17.488715"}, "title": "Tog the dog", "covers": , "last_modified": {"type":... (3 Replies)
Discussion started by: ahfze
3 Replies

3. UNIX for Dummies Questions & Answers

Issue when using egrep to extract strings (too many strings)

Dear all, I have a data like below (n of rows=400,000) and I want to extract the rows with certain strings. I use code below. It works if there is not too many strings for example n of strings <5000. while I have 90,000 strings to extract. If I use the egrep code below, I will get error: ... (3 Replies)
Discussion started by: forevertl
3 Replies

4. Shell Programming and Scripting

Extract text between two strings

Hi, I have a text like these: ECHO "BEGGINING THE SHELL....." MV FILE1 > FILE2 UNIQ_ID=${1} PARTITION_1=`${PL}/Q${CON}.KSH "SELECT ....." PARTITION_2=`${PL}/Q${CON}.KSH "SELECT ........" ${PL}/Q${CON}.KSH "CREATE ...." IF .... ....... I would like to extract only text that only... (4 Replies)
Discussion started by: mierdatuti
4 Replies

5. UNIX for Dummies Questions & Answers

Extract strings based on the value

I have a file with multiple columns (in this case, the file has 3 columns): NM_001006304 (-33.7) XM_418228 (-38.4) JN880447 (-33.7) CR387600 (-33.7) CR524203 (-36.3) GALGA_6AKII_KRT75 (-33.7) GALGA25_SC7 (-31.9) CR352795 (-36.3) NM_204172 (-31.7) NM_204137 (-31.9) NM_001030561 (-36.3) AB011672... (7 Replies)
Discussion started by: yuejian
7 Replies

6. Shell Programming and Scripting

sed to extract all strings

Hi, I have a text file containing 2 lines as follows: I'm trying to extract all the strings following an "AME." The output would be as follows: BUSINESS_UNIT PROJECT_ID ACTIVITY_ID RES_USER1 RESOURCE_ID_FROM ANALYSIS_TYPE BI_DISTRIB_STATUS BUSINESS_UNIT PROJECT_ID ACTIVITY_ID... (5 Replies)
Discussion started by: simpletech369
5 Replies

7. Shell Programming and Scripting

Extract two strings from a file and create a new file with these strings

I have the following lines in a log file. It would be great if some one can help me to create a new file with the just entries in the below format. 66.150.161.195 HPSAC=Z05 66.150.161.196 HPSAC=A05 That is just extract the IP address and the string DPSAC=its value 66.150.161.195 -... (1 Reply)
Discussion started by: Tuxidow
1 Replies

8. Shell Programming and Scripting

How to Extract text between two strings?

Hi, I want to extract some text between two strings in a line i am using following command i.e; awk '/-string1/,/-string2/' filename contents of file is--- line1 line2 aaa -bbb -ccc -string1 c,d,e -string2 line4 but it is showing complete line which is having searched strings. aaa... (19 Replies)
Discussion started by: emresearch
19 Replies

9. Shell Programming and Scripting

Extract data between two strings

Hi , I have a billing CDR file which has repeated lines as indicated below and I need to extract data between two strings (i.e.: <?> and </?>). Eventually, map that information with the corresponding field. I'm new to unix, any help will be greatly appreciated. Gamini Input (single line): !... (3 Replies)
Discussion started by: jaygamini
3 Replies

10. Shell Programming and Scripting

extract strings between tags

Hi, I have data as follows in a text file <key='data1'> <String>abcdef</String> <String>abcdef1</String> <String>abcdef2</String> </key> <key='data2'> <String>abcdef</String> <String>abcdef1</String> <String>abcdef2</String> <String>abcdef3</String> </key> Is there a way i... (10 Replies)
Discussion started by: userscript
10 Replies
Login or Register to Ask a Question