flexible sed command needed to handle multiple input types


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting flexible sed command needed to handle multiple input types
# 1  
Old 03-19-2008
flexible sed command needed to handle multiple input types

Hello, I need a smart sed command that can take any of the following two as an input and give below mentioned output. As you can see, I am trying to convert some C code

INPUT:
struct abc_sample1 {
char myString[32];
UINT16 myValue1[10];
UINT64 myValue2;
};

typedef struct {
char myString[32];
UINT16 myValue1[10];
UINT64 myValue2;
} abc_sample1;


OUTPUT:

ABC_DataDesc_T abc_sample1_desc[] = {
char myString[32];
UINT16 myValue1[10];
UINT64 myValue2;
};


Thanks a bunch
# 2  
Old 03-19-2008
This is a candidate for lex & yacc if you need to do a lot of it. .
Code:
awk ' BEGIN {found=0;
             keep=""
             abc_found=0;
             replacement=sprintf("%s\n%s\n%s\n%s\n%s\n",
                       "ABC_DataDesc_T abc_sample1_desc[] = {",
	                   "char myString[32];",
	                   "UINT16 myValue1[10];",
	                   "UINT64 myValue2;", 
	                   "};" )
              }
       {       
       if( index($0, "}")> 0 && found==1 ){       
       	   if($0 ~ /abc_sample1/) {abc_found=1} 
           if(abc_found==1) { print replacement }
           else          {printf"%s%s\n", keep, $0}
           keep=""
           found=0
           abc_found=0
           continue
       }
       if($0 ~ /struct/ ){ found=1 }
       if($0 ~ /abc_sample1/) {abc_found=1}
       if(found==1) { keep=sprintf("%s%s\n", keep, $0) }
       else         {print $0}  
       }  ' filename.c

input
Code:
struct abc_sample1 {
char myString[32];
UINT16 myValue1[10];
UINT64 myValue2;
};
typedef int fd;

typedef struct{
   char    customer_number [9];
   char    premise_number [7];
   char    service_number [4];
   char    bill_no [6];
   char    record_type [8];
}SORT_KEY;
typedef struct {
        SORT_KEY sort_key;
        char     service_category[4];
        char     conversion_factor [8];
        char     meter_number [10];
        char     days_of_service [3];
        char     meter_previous_read_date [11];
        char     meter_previous_read_value [10];
        char     meter_present_read_date [11];
        char     meter_present_read_value [10];
        char     meter_consumption_value [10];
        char     meter_read_type [4];
        char     meter_multiplier [8];
        char     meter_read_route [8];
        char     units_of_leakage [10];
        char     chng_out_meter_number [10];
        char     chng_out_DOS [3];
        char     chng_out_previous_read_date [11];
        char     chng_out_previous_read_value [10];
        char     chng_out_present_read_date [11];
        char     chng_out_present_read_value [10];
        char     chng_out_consumption_value [10];
        char     chng_out_read_type [4];
        char     chng_out_multiplier [8];
        char     previous_printed_date [11];
} my_urrshis_t;


typedef struct {
char myString[32];
UINT16 myValue1[10];
UINT64 myValue2;
} abc_sample1;

output
Code:
ABC_DataDesc_T abc_sample1_desc[] = {
char myString[32];
UINT16 myValue1[10];
UINT64 myValue2;
};

typedef int fd;

typedef struct{
   char    customer_number [9];
   char    premise_number [7];
   char    service_number [4];
   char    bill_no [6];
   char    record_type [8];
}SORT_KEY;
typedef struct {
        SORT_KEY sort_key;
        char     service_category[4];
        char     conversion_factor [8];
        char     meter_number [10];
        char     days_of_service [3];
        char     meter_previous_read_date [11];
        char     meter_previous_read_value [10];
        char     meter_present_read_date [11];
        char     meter_present_read_value [10];
        char     meter_consumption_value [10];
        char     meter_read_type [4];
        char     meter_multiplier [8];
        char     meter_read_route [8];
        char     units_of_leakage [10];
        char     chng_out_meter_number [10];
        char     chng_out_DOS [3];
        char     chng_out_previous_read_date [11];
        char     chng_out_previous_read_value [10];
        char     chng_out_present_read_date [11];
        char     chng_out_present_read_value [10];
        char     chng_out_consumption_value [10];
        char     chng_out_read_type [4];
        char     chng_out_multiplier [8];
        char     previous_printed_date [11];
} my_urrshis_t;


ABC_DataDesc_T abc_sample1_desc[] = {
char myString[32];
UINT16 myValue1[10];
UINT64 myValue2;
};

# 3  
Old 03-19-2008
Thanks a lot for your input and code. As I see following two inputs

Input pattern is
^.*struct $1 { multi-line structure } $2;

Output is
ABC_DataDesc_T $1/$2_desc { multi-line structure };

where
1. only one out of $1 and $2 is non-empty
2. Anything before string "struct" (including struct) is replaced by a static string ABC_DataDesc_T (sorry about the confusing name, which made it look that it depends on name of struct)
3. everything between multi-line matching braces { } need to remain intact.
4. ; at the end

I will see if I can figure out lex/yacc
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

SED command using multiple input files

What is the syntax to use multiple input files in a SED command. i.e. substitute a word with a phrase in every file in a directory. for every file in /usr/include that has the word "date" in the file grep -l '\<date\>' /usr/include/*.h find each occurrence of the word "time" in the file &... (3 Replies)
Discussion started by: sheoguey
3 Replies

2. Linux

Simplified find command to find multiple file types

Hi, I'm using the following command to find the multiple requierd file types and its working fine find . -name "*.pl" -o -name "*.pm" -o -name "*.sql" -o -name "*.so" -o -name "*.sh" -o -name "*.java" -o -name "*.class" -o -name "*.jar" -o -name "*.gz" -o -name "*.Z" -type f Though... (2 Replies)
Discussion started by: vickramshetty
2 Replies

3. Shell Programming and Scripting

sed command help needed.

vif = I need to replace "00:16:3E:64:FB:D3" to a new mac address value from below mentioned file. # cat vm.cfg acpi = 1 apic = 1 builder = 'hvm' device_model = '/usr/lib/xen/bin/qemu-dm' disk = kernel = '/usr/lib/xen/boot/hvmloader' memory = '300' name = 'vm_temp' on_crash =... (1 Reply)
Discussion started by: pinga123
1 Replies

4. Shell Programming and Scripting

Help needed sed command.

I want to execute below command using line number as a variable. sed '5c\ disk = jskdjfdsk' vm.cfg How do i substitute a variable in place of 5 for example i tried substituting sed '$variablec\ disk = jskdjfdsk' vm.cfg and sed '"$variable"c\ disk = jskdjfdsk' vm.cfg) but they... (2 Replies)
Discussion started by: pinga123
2 Replies

5. UNIX for Dummies Questions & Answers

Help needed on sed command

Hi, I am splitting a file based on pattern using sed -f command as below: sed_cmd2 is the Pattern filename which has the below mentioned pattern in it: #n /\(.*\) \(.*\) \(mith\).*/w smith Input file has following data 1 John Smith Chicago 2 Mary Smith New York 3 Judy... (2 Replies)
Discussion started by: 12345
2 Replies

6. Shell Programming and Scripting

SED command ---------help needed

Hi all I am new babie to shell script, so please advise me n help me . suppose i have a string "abacus sabre", i need to replace occurences 'ab' with 'cd' and i need to store this result into same string and i need to return this result from script to the calling function, where as the string... (4 Replies)
Discussion started by: veerapureddy
4 Replies

7. Shell Programming and Scripting

Help needed in processing multiple variables in a single sed command.

Is it possible to process multiple variables in a single sed command? I have the following ksh with three variables and I want to search for all variables which start with "var" inside input.txt. I tired "$var$" but it just prints out everyting in input.txt and does not work. $ more test.ksh... (5 Replies)
Discussion started by: stevefox
5 Replies

8. UNIX for Dummies Questions & Answers

help needed for sed command

Hi all, I need some help with sed command. I'm trying to move all the files with a modified date within 12:00 - 13:00. What i'm doing here is to do is ls -lt | grep 'Jun 22 12:' > list.txt to get all file names within that period. However how do i strip off -rw-r--r-- 1 enfoot adi... (2 Replies)
Discussion started by: manualvin
2 Replies

9. Linux

File types help needed

Hi all, quick question... Im trying to configure Redhat 9 to dial out to my ISP AOL. I have found some software to do this but at present I can't get net access under Linux for the reason stated. I can however acces the net using my laptop running windows. The question is: I have downloaded... (3 Replies)
Discussion started by: brady9953
3 Replies
Login or Register to Ask a Question