Bash script reg-exp , replace , open and write


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Bash script reg-exp , replace , open and write
# 1  
Old 06-20-2012
Question Bash script reg-exp , replace , open and write

Hi All
I am a new in scripting language and I would like help for you guys

I would like to create a file named constant.h and search into all files *.m in specific directory for a reg-exp
Code:
@"LBL_[[0-9]]+"

exp: @"LBL_75847" , and write those matchs to constant.h if there are not written (no duplication into the file constants) like this
Code:
NSString *const C_LBL_[[0-9]] = thematch; // exp NSString *const C_LBL_78784 = @"LBL_78784";

Code:
NSString *const C_LBL_[[0-9]] = thematch; // exp NSString *const C_LBL_78787 = @"LBL_78787";

moreover this script should also replace all matched
Code:
@"LBL_[[0-9]]+"

into *.m files with the constant var which is
Code:
 C_LBL_[[0-9]]+

Thanks in advance
# 2  
Old 06-20-2012
Could you show a 'before' and 'after' for part of your data file? I really doubt you want '= thematch' in there, and doubt you want [[0-9]] as part of the declaration, but why you put the part you DO want in comments I can't imagine, and it seems practically unrelated to the thing you're substituting so I'm left puzzled.
# 3  
Old 06-20-2012
hi actually I have files *.m that contain objective c code like this :
Code:
 tableviewlogin.backgroundView = nil;
    [welcometitle setFont:[UIFont fontWithName:FONTB size:FONTSIZETITLE]];
    [welcometitle setText:[MSharedFunctions UF8ErrorMessageForCode:@"LBL_10000"]];
    [welcometitle setTextAlignment:UITextAlignmentCenter];
    NSString *buttontitle = [MSharedFunctions UF8ErrorMessageForCode:@"LBL_10012"];
    [forgotpassword setTitle:buttontitle forState:UIControlStateNormal];
    [forgotpassword setTitle:buttontitle forState:UIControlStateHighlighted];
    [self.navigationItem setTitle:[MSharedFunctions UF8ErrorMessageForCode:@"LBL_10011"]];
    [[self tabBarItem] setTitle:[MSharedFunctions UF8ErrorMessageForCode:@"LBL_10804"]];

I want to generate a file that constant or whatever name which contain
Code:
 NSString *const C_LBL_10000 = @"LBL_10000";
 NSString *const C_LBL_10012 = @"LBL_10012";
 NSString *const C_LBL_10011 = @"LBL_10011";
 NSString *const C_LBL_10804 = @"LBL_10804";

//No duplication B/C it's variables
and replace this const variables into whatever file contain the match *.m
for example


Code:
 tableviewlogin.backgroundView = nil;
    [welcometitle setFont:[UIFont fontWithName:FONTB size:FONTSIZETITLE]];
    [welcometitle setText:[MSharedFunctions UF8ErrorMessageForCode:C_LBL_10000]];
    [welcometitle setTextAlignment:UITextAlignmentCenter];
    NSString *buttontitle = [MSharedFunctions UF8ErrorMessageForCode:C_LBL_10012];
    [forgotpassword setTitle:buttontitle forState:UIControlStateNormal];
    [forgotpassword setTitle:buttontitle forState:UIControlStateHighlighted];
    [self.navigationItem setTitle:[MSharedFunctions UF8ErrorMessageForCode:C_LBL_10011]];
    [[self tabBarItem] setTitle:[MSharedFunctions UF8ErrorMessageForCode:C_LBL_10804]];

My problem I have a lot of classes and I should do this work and rather than do it manually it we be coud to create script to do this work
I hope it's clear now

Thanks
# 4  
Old 06-20-2012
Never overwrite your originals; that's a recipe for disaster. One mistake and all your code is blown away.

I'd suggest renaming your '.m' files into '.pm' files instead. Create '.m' files out of your '.pm' files when you process them. Like this:

Code:
$ cat ocstr.awk

# If the code contains @"LBL_....", replace it with C_LBL_... and
# remember the labels for later.
match($0, /@"LBL_[0-9]*\"/) {
        S=$0; P=""

        do        # Loop until there's nothing left in the right half
        {
                A[L=substr(S, RSTART+2, RLENGTH-3)]++; # Remember label
                P=P substr(S, 1, RSTART-1) "C_" L;
                S=substr(S, RSTART+RLENGTH);
        }
        while(match(S, /@"LBL_[0-9]*\"/)); # Keep hunting for more labels

        $0=P S; # Update the line to be printed
}

# If we are given file.pm, print into file.m
{       O=FILENAME;
        sub(/[.]pm$/, ".m", O);
        print > O;      }

END {
        for(L in A) printf("NSString *const C_%s = @\"%s\";\n", L, L);
}

$ awk -f ocstr.awk dir/*.pm > list

$ cat list

NSString *const C_LBL_10011 = @"LBL_10011";
NSString *const C_LBL_10012 = @"LBL_10012";
NSString *const C_LBL_10804 = @"LBL_10804";
NSString *const C_LBL_10000 = @"LBL_10000";

$ cat dir/*.m

tableviewlogin.backgroundView = nil;
    [welcometitle setFont:[UIFont fontWithName:FONTB size:FONTSIZETITLE]];
    [welcometitle setText:[MSharedFunctions UF8ErrorMessageForCode:C_LBL_10000]];
    [welcometitle setTextAlignment:UITextAlignmentCenter];
    NSString *buttontitle = [MSharedFunctions UF8ErrorMessageForCode:C_LBL_10012];
    [forgotpassword setTitle:buttontitle forState:UIControlStateNormal];
    [forgotpassword setTitle:buttontitle forState:UIControlStateHighlighted];
    [self.navigationItem setTitle:[MSharedFunctions UF8ErrorMessageForCode:C_LBL_10011]];
    [[self tabBarItem] setTitle:[MSharedFunctions UF8ErrorMessageForCode:C_LBL_10804]];

$

These 2 Users Gave Thanks to Corona688 For This Post:
# 5  
Old 06-20-2012
Thanks a lot, I will test and give u my FB

Thanks again
# 6  
Old 06-22-2012
Hi sorry I have a question related to same post , I would like to pass all files *.m to the same script but the files are in different directories
this command is not working I think it's wrong ?
Code:
awk -f ../Desktop/ocstr.awk find . -type f -name '*.m'


Last edited by molwiko; 06-22-2012 at 08:03 AM..
# 7  
Old 06-22-2012
I strongly suggest reading my post before blindly running my code, since running my code on .m files may destroy them. Never overwrite your originals; that's a recipe for disaster. One mistake and all your code is blown away. Rename your .m files into .pm. Use it to generate .m files from .pm's.

Quote:
Originally Posted by Corona688
Never overwrite your originals; that's a recipe for disaster. One mistake and all your code is blown away.

I'd suggest renaming your '.m' files into '.pm' files instead. Create '.m' files out of your '.pm' files when you process them.
Code:
find . -iname '*.pm' | xargs awk -f ocstr.awk | sort -u > list

This User Gave Thanks to Corona688 For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to use regular exp to replace the character in the file?

Hi Unix Gurus, yesterday I asked a question and got answer, it works fine. I have one more thing need to help in the code awk '{print substr($0,1,3)"xxx"substr($0,7)}' file If I have 50 charactor's need to be replaced, is there any easy way to use reg exp or I have to input 50 XXXXx......... (12 Replies)
Discussion started by: ken6503
12 Replies

2. Shell Programming and Scripting

Bash script - coloring reg. expressions in text

Hi all, is there anyone good at bash who will help me? I need to use syntax ${string/pattern/replacement} The problematic part where I am stuck is: #!bin/bash text="A cat is on a mat." exp="cat" newexp="SOMECODEcatSOMECODE" newtext=${${text}/${exp}/${newexp}} == > ERROR "wrong... (4 Replies)
Discussion started by: JohnnyM77
4 Replies

3. Emergency UNIX and Linux Support

Need Help On REG EXP in unix

Respected All, I have a very big xml in that i want to search only below 3 lines. <target name ="UpgradePrimaryBox" depends ="configureBox1"> <echo> Finished Upgrading Primary Box </echo> </target> grep -i "<target.*UpgradePrimaryBox" this gives me the first line. then i need to match... (7 Replies)
Discussion started by: ameyrk
7 Replies

4. Shell Programming and Scripting

perl reg-exp

$var1="LEN"; $VAR2="CODLENTT"; now, var2 contains var1(LEN).How do i check this in perl.... whether one string is a part of another..? if (<logic>) { my operation; } what'd be the logic.. (4 Replies)
Discussion started by: vijay_0209
4 Replies

5. Shell Programming and Scripting

Perl reg exp

Hi, I am using the following piece of code for extracting some data from in between some tags ... $text =~ /<TAG1>(.*)<\/TAG1>.*<TAG2>(.*)<\/TAG2>.*<TAG3>(.*)<\/TAG4>.*<TAG5>(.*)<\/TAG5>/; $tag1=$1; print "\n$tag1"; But I am getting an error like Use of uninitialized value in... (1 Reply)
Discussion started by: King Nothing
1 Replies

6. UNIX for Dummies Questions & Answers

extract a part of a path like (input: /etc/exp/home/bin ====> output: exp)

Hi, I need to make some extraction . with the following input to get the right output. input: /etc/exp/home/bin ====> output: exp and input: aex1234 ===> output: ex Thanks for your help, (4 Replies)
Discussion started by: yeclota
4 Replies

7. Shell Programming and Scripting

reg exp for sed

$ cat file.txt asd <AA>dev <LL>def <RR>sha This works for me: $ sed -r 's/^ .*<LL>def/\t<LL>my/' file.txt asd <AA>dev <LL>my <RR>sha But, this does not work for me: $ sed -r 's/^\s+<LL>def/\t<LL>my/' file.txt asd ... (1 Reply)
Discussion started by: demoprog
1 Replies

8. Shell Programming and Scripting

reg exp question

Hi, Should be a difference between ']]*' and ']+' ? I use them in bash with sed and grep. Thanks (1 Reply)
Discussion started by: ynir
1 Replies

9. Shell Programming and Scripting

usage...sed/awk/reg-exp ..in shell scripting

in shell scripting there is extensive usage of i> regular expression ii>sed iii>awk can anyone tell me the suitable contexts ...i mean which one is suitable for what kind of operation. like the reg-exp and sed seems to be doing the same job..i.e pattern matching (1 Reply)
Discussion started by: mobydick
1 Replies

10. Shell Programming and Scripting

Using reg. exp. variable in AWK??

Any idea please: How to pass a reg. exp. variable to awk call in a shell??? Thank u #!/bin/sh reg_exp=name awk '/reg_exp/{ print; }' $1 (5 Replies)
Discussion started by: andy2000
5 Replies
Login or Register to Ask a Question