Complex string operation (awk, sed, other?)


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Complex string operation (awk, sed, other?)
# 1  
Old 03-22-2013
Complex string operation (awk, sed, other?)

I have a file that contains RewriteRules for 200 countries (2 examples for 1 country below):

Code:
RewriteRule ^/at(/|/index.html|)$ http://%{HTTP_HOST}/locate/index.html?locale=de_AT [R=301,L]

#&

RewriteRule ^/at_english(/|/index.html|)$ http://%{HTTP_HOST}/locate/index.html?locale=en_AT [R=301,L]

I have another list of redirects for the mobile versions of these sites in the following format:
Code:
RewriteRule ^/at_engilsh(/|/index.html|)$ http://%{HTTP_HOST}m.website.com/www.website.com/at_engilsh [R=301,L]

Bear in mind the at_english is just 1 of the country codes, there are many more.

So my goals is to go from

Code:
RewriteRule ^/at_english(/|/index.html|)$ http://%{HTTP_HOST}/locate/index.html?locale=en_AT [R=301,L]

#to

RewriteRule ^/at_engilsh(/|/index.html|)$ http://%{HTTP_HOST}m.website.com/www.website.com/at_engilsh [R=301,L]

I'm supplying the awk / pseudo code for one way I've thought to do it.

Code:
awk '
{
newurl="m.website.com/www.website.com/"
one=substr($0,1,14)
two=substr($1,13,37)
rest=substr($4,1)

# The line below this comment is the section I'm having difficulty with because 
#I have country codes in multiple formats at / at_engilsh / at_french
#I want to select all characters between ^/ ---> (  
code=substr($2,1) 
     

printf ("%s%s%s%s%s %s\n", one,code,two,newurl,code, rest)
}' input

So I either need help converting the pseudo code into actual code, or suggestions on a better way to do this operation.

Thank you for any help
# 2  
Old 03-22-2013
The term rewrite rules, to me, says sendmail.cf They have a special syntax and nature, and their placement and exact construction depends on the version fo sendmail you are writing for. Rewrite rules keep being applied until they do not change the entity any more, so sometimes you have to change it a+ to b and then b to a, becaulse a is in a+.

Google helps me see you might be more likely talking apache URL rewrite. I wonder if there is an apache forum?

Most of us write in our head in pseudo-code, not awk, and then translate it into the desired language.

It looks like you are short a slash in the example. If your object to to use m., then you need to not use HTTP_HOST or just prefix it with 'm.' if it is a domain name.
This User Gave Thanks to DGPickett For This Post:
# 3  
Old 03-22-2013
What is "at_engilsh"?
# 4  
Old 03-22-2013
I'm not sure I understand what you're trying to do either, but I think the following awk script does what your examples seem to request.
Code:
awk 'BEGIN { newurl = "m.website.com/www.website.com/" }
{       match($2, /[^(]*[(]/)
        code = substr($2, 3, RLENGTH - 3)
        match($3, /[^}]*}/)
        printf("%s %s %s%s%s %s\n",
                $1, $2, substr($3, 1, RLENGTH), newurl, code, $4)
}' input

With the following in the file named input:
Code:
RewriteRule ^/at(/|/index.html|)$ http://%{HTTP_HOST}/locate/index.html?locale=de_AT [R=301,L] 
RewriteRule ^/at_english(/|/index.html|)$ http://%{HTTP_HOST}/locate/index.html?locale=en_AT [R=301,L]
RewriteRule ^/at_engilsh(/|/index.html|)$ http://%{HTTP_HOST}m.website.com/www.website.com/at_engilsh [R=301,L]
RewriteRule ^/at_english(/|/index.html|)$ http://%{HTTP_HOST}/locate/index.html?locale=en_AT [R=301,L]
RewriteRule ^/at_french(/|/index.html|)$ http://%{HTTP_HOST}/locate/index.html?locale=fr_AT [R=301,L]

the output produced is:
Code:
RewriteRule ^/at(/|/index.html|)$ http://%{HTTP_HOST}m.website.com/www.website.com/at [R=301,L]
RewriteRule ^/at_english(/|/index.html|)$ http://%{HTTP_HOST}m.website.com/www.website.com/at_english [R=301,L]
RewriteRule ^/at_engilsh(/|/index.html|)$ http://%{HTTP_HOST}m.website.com/www.website.com/at_engilsh [R=301,L]
RewriteRule ^/at_english(/|/index.html|)$ http://%{HTTP_HOST}m.website.com/www.website.com/at_english [R=301,L]
RewriteRule ^/at_french(/|/index.html|)$ http://%{HTTP_HOST}m.website.com/www.website.com/at_french [R=301,L]

As always, if you're running on a Solaris/SunOS system, use /usr/xpg4/bin/awk or nawk instead of awk.

Last edited by Don Cragun; 03-22-2013 at 07:12 PM..
This User Gave Thanks to Don Cragun For This Post:
# 5  
Old 03-22-2013
Sorry the at_engilsh was a typo. And it is an apache rewrite rule, though my question really doesn't pertain to the rewrite rule at all. The rules function just fine, the question is more just for operating on one iteration of the string and using awk to transform into the other iteration.

---------- Post updated at 04:46 PM ---------- Previous update was at 04:43 PM ----------

Quote:
Originally Posted by Don Cragun
Code:
wk 'BEGIN { newurl = "m.website.com/www.website.com/" }
{       match($2, /[^(]*[(]/)
        code = substr($2, 3, RLENGTH - 3)
        match($3, /[^}]*}/)
        printf("%s %s %s%s%s %s\n",
                $1, $2, substr($3, 1, RLENGTH), newurl, code, $4)
}' input

Yes this is exactly what I needed, thank you for your assistance and apologies for my less than stellar description of what I was looking for!
# 6  
Old 03-25-2013
We have our ways of extracting requirements from the reticent! Smilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Complex Filter using grep, awk or sed

Hi, I'm not very familiar witrh sed or awk and hope the somebody can help me to solve my problem. I need to filter a text report using grep, sed or awk. I would like to cut out text lines with the pattern INFO and if exists the following lines of the pattern DETAILS. I need te keep the lines with... (4 Replies)
Discussion started by: Frankg
4 Replies

2. Shell Programming and Scripting

Multiple Replacement in a Text File in one operation (sed/awk) ?

Hi all, Saying we have two files: 1. A "Reference File" whose content is "Variable Name": "Variable Value" 2. A "Model File" whose content is a model program in which I want to substitute "VariableName" with their respective value to produce a third file "Program File" which would be a... (4 Replies)
Discussion started by: dae
4 Replies

3. Shell Programming and Scripting

Replace string in XML file with awk/sed with string from another

Sorry for the long/weird title but I'm stuck on a problem I have. I have this XML file: </member> <member> <name>TransactionID</name> <value><string>123456789123456</string></value> </member> <member> <name>Number</name> ... (9 Replies)
Discussion started by: cozzin
9 Replies

4. Programming

How to replace the complex strings from a file using sed or awk?

Dear All, I am having a requirement to find the difference between 2 files and generate a discrepancy report out of it as an html page. I prefer using diff -y file1 file2 since it gives user friendly layout to know any discrepancy in the record and unique records among the 2 file. Here's how it... (12 Replies)
Discussion started by: Badhrish
12 Replies

5. Shell Programming and Scripting

sed or awk command to replace a string pattern with another string based on position of this string

here is what i want to achieve... consider a file contains below contents. the file size is large about 60mb cat dump.sql INSERT INTO `table1` (`id`, `action`, `date`, `descrip`, `lastModified`) VALUES (1,'Change','2011-05-05 00:00:00','Account Updated','2012-02-10... (10 Replies)
Discussion started by: vivek d r
10 Replies

6. Shell Programming and Scripting

Help - Search for string, then do string operation on line

Hi, I wish to find all lines that contain a specific search word, and then do few string operations on that line. The idea is to "fix" the file which has been moved from windows to unix. Using unix - Sun Solaris Test input ("t2.sas") statement1 statement2 libname yahoo ... (6 Replies)
Discussion started by: deepaksinbox
6 Replies

7. Shell Programming and Scripting

SED complex string replacement

sed -i 's:"ps -ef | grep $(cat $PID_FILE) | grep -v grep":"ps -C java -o pid,cmd | grep ${SERVER_NAME} | cut -d' ' -f1 | grep -v grep":g' scriptName That's what I'm attempting to do. I'm attempting to replace this: ps -ef | grep $(cat $PID_FILE) | grep -v grep with this: ps -C java -o... (5 Replies)
Discussion started by: cbo0485
5 Replies

8. UNIX for Dummies Questions & Answers

string operation

I am trying to ask for full name in a script, Then echo back to the user with the surname only, omitting the first name. Thanks (2 Replies)
Discussion started by: orjnet
2 Replies

9. Shell Programming and Scripting

string operation

i am new user of unix.i have a question.My script is- export STR_ALFA=`head -2 "${FILE_PATH}"|tail -1|cut -d"," -f1` "${TEST_HOME}"/function/chk_alfa.ksh STR_ALFA now i want to check STR_ALFA: 1)whether is alphabetic 2)whether is numeric 3)whether is alphanumeric... (1 Reply)
Discussion started by: arghya_owen
1 Replies

10. Shell Programming and Scripting

Complex Sed/Awk Question?

Hello, So i have this file called /apps/turnout which looks like that of the contents of the /etc/shadow (but not exactly) the file has a long list in it. basically, the contents of this file looks something similar to the following: jajajajalala:D#$#AFVAdfda lalabavisof:#%R@fafla#$... (3 Replies)
Discussion started by: SkySmart
3 Replies
Login or Register to Ask a Question