Sponsored Content
Top Forums Shell Programming and Scripting Perl: Conditional replace based on previous and current value in a line Post 302602527 by birei on Monday 27th of February 2012 03:50:20 PM
Old 02-27-2012
Hi naveen@,

I don't understand your perl script. It outputs nothing with that input file, and I think you didin't match the exact withespace.

Try next one:
Code:
$ cat infile
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = P0; /* if next shift_port is P0 I need to replace this with M0; and next shift_port's P0; with 00;
    port3       = 0;
    reset       = 1;
   }
  W wf_cyc;
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = P0;
    port3       = 0;
    reset       = 1;
   }
  Macro "Inputs" { 
    test_ip =
        110111010110
  }

  W wf_cyc;
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = 00;
    port3       = 0;
    reset       = 1;
  }
  W wf_cyc;
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = 00; 
    port3       = 0;
    reset       = 1;
   }
  W wf_cyc;
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = P0;/* if next shift_port is P0; I need to replace this with M0; and next shift_port's P0 with 00;
    port3       = 0;
    reset       = 1;
   }
  W wf_cyc;
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = P0;/* if next shift_port is P0; I need to replace this with M0; and next shift_port's P0 with 00;
    port3       = 0;
    reset       = 1;
   }
}
$ cat script.pl
use warnings;
use strict;

die qq[Usage: perl $0 <input-file>\n] unless @ARGV == 1;

my @range_lines = ();

while ( <> ) {
        chomp;
        if ( m/\A\s*(?i:shift_port)\s*=/ ... m/\A\s*(?i:shift_port)\s*=/ ) {
                push @range_lines, $_;
                next;
        }

        if ( @range_lines ) {
                if ( $range_lines[0] =~ m/=\s*P0\s*;/ &&
                         $range_lines[ $#range_lines ] =~ m//
                ) {
                        $range_lines[0] =~ s/P0/M0/;
                        $range_lines[ $#range_lines ] =~ s/P0/00/;
                }

                printf qq[%s\n], join qq[\n], splice @range_lines;
        }

        printf qq[%s\n], $_;
}
$ perl script.pl infile
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = M0; /* if next shift_port is P0 I need to replace this with M0; and next shift_port's P0; with 00;
    port3       = 0;
    reset       = 1;
   }
  W wf_cyc;
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = 00;
    port3       = 0;
    reset       = 1;
   }
  Macro "Inputs" { 
    test_ip =
        110111010110
  }

  W wf_cyc;
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = 00;
    port3       = 0;
    reset       = 1;
  }
  W wf_cyc;
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = 00; 
    port3       = 0;
    reset       = 1;
   }
  W wf_cyc;
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = M0;/* if next shift_port is P0; I need to replace this with M0; and next shift_port's P0 with 00;
    port3       = 0;
    reset       = 1;
   }
  W wf_cyc;
  V { 
    port1       = P;
    port2       = 0;
    shift_port  = 00;/* if next shift_port is P0; I need to replace this with M0; and next shift_port's P0 with 00;
    port3       = 0;
    reset       = 1;
   }
}

Regards,
Birei
This User Gave Thanks to birei For This Post:
 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

replace [previous] line

Hi ,suppose I have a file title=dsafsadf ........ ....... year=1995 author=john smith ............ title=bbbbbb ........ ....... year=1988 author=alex I need to replace the title line with a expression that contains variables year and author. I want to use a python readline for loop.... (10 Replies)
Discussion started by: grossgermany
10 Replies

2. Shell Programming and Scripting

sed conditional string replace for each line

Hi all, I appreciate the enormous amount of knowledge that flows in this forum. I am an average UNIX user. I have many files with lines like the below. I have separated each line with space for ease of reading. I need to replace the first occurance of "/00" with null on those lines that have... (6 Replies)
Discussion started by: Nanu_Manju
6 Replies

3. Shell Programming and Scripting

Print previous, current and next line using sed

Hi, how can i print the previous, current and next line using sed? current line is the matching line. The following prints all lines containing 'Failure' and also the immediate next line cat $file | sed -n -e '/Failure/{N;p;}' Now, i also want to print the previous line too. Thanks,... (8 Replies)
Discussion started by: ysrinu
8 Replies

4. Shell Programming and Scripting

How to use sed to search for string and Print previous two lines and current line

Hello, Can anybody help me to correct my sed syntax to find the string and print previous two lines and current line and next one line. i am using string as "testing" netstat -v | sed -n -e '/test/{x;2!p;g;$!N;p;D;}' -e h i am able to get the previous line current line next line but... (1 Reply)
Discussion started by: nmadhuhb
1 Replies

5. Shell Programming and Scripting

Printing previous line based on pattern using sed

Hi, I have a written a shell script to get the previous line based on the pattern. For example if a file has below lines: ---------------------------------------------- #UNBLOCK_As _per #As per 205.162.42.92 #BLOCK_As_per #----------------------- #input checks abc.com... (5 Replies)
Discussion started by: Anjan1
5 Replies

6. UNIX for Dummies Questions & Answers

Awk to print data from current and previous line

Hi guys, I have found your forum super useful. However, right now I am stuck on a seemingly "simple" thing in AWK. I have two columns of data, the first column in Age (in million years) and the second column is Convergence Rate (in mm/yr). I am trying to process my data so I can use it to... (2 Replies)
Discussion started by: awk_noob_456
2 Replies

7. Shell Programming and Scripting

Sed Comparing Parenthesized Values In Previous Line To Current Line

I am trying to delete lines in archived Apache httpd logs Each line has the pattern: <ip-address> - - <date-time> <document-request-URL> <http-response> <size-of-req'd-doc> <referring-document-URL> This pattern is shown in the example of 6 lines from the log in the code box below. These 6... (1 Reply)
Discussion started by: Proteomist
1 Replies

8. Shell Programming and Scripting

Perl to send previous and current value

For example, I have a file called number.txt. x y 1 1 2 4 3 9 4 6 5 5 6 6 7 9 8 4 9 1 10 0 ... And I want to print out the value of x and y, if y%4==0 and the next value of y%4==0. Thus, the sample output is: 1 1 *because the previous x before 2 is 1 2 4 *because 4%4 == 0 7 9... (2 Replies)
Discussion started by: Tzeronone
2 Replies

9. Shell Programming and Scripting

Replace first field of a line with previous filed of the line

Hi Everyone, I have a file as below: IM2345638,sherfvf,usha,30 IM384940374,deiufbd,usha,30 IM323763822,cdejdkdnbds,theju,15 0,dhejdncbfd,us,20 IM398202038,dhekjdkdld,tj,30 0,foifsjd,u2,40 The output i need is as below IM2345638,sherfvf,usha,30... (4 Replies)
Discussion started by: usha rao
4 Replies

10. Shell Programming and Scripting

sed conditional \n replace for each line

How could be removed \n only if appearing at position 80 in the line? (4 Replies)
Discussion started by: RomanF
4 Replies
Excel::Template::Container::Conditional(3pm)		User Contributed Perl Documentation	      Excel::Template::Container::Conditional(3pm)

NAME
Excel::Template::Container::Conditional - Excel::Template::Container::Conditional PURPOSE
To provide conditional execution of children nodes NODE NAME
IF INHERITANCE
CONTAINER ATTRIBUTES
o NAME This is the name of the parameter to test. It is resolved like any other parameter name. (q.v. VAR for more info.) o VALUE If VALUE is set, then a comparison operation is done. The value of NAME is compared to VALUE using the value of OP. o OP If VALUE is set, then this is checked. If it isn't present, then '==' (numeric equality) is assumed. OP must be one of Perl the numeric comparison operators or the string comparison operators. All 6 of each kind is supported. Note: If you want to use < or <=, you must instead use &lt; or &lt;=. This is to make sure it will parse with XML::Parser. You should not need to use &gt; or &gt;= instead of > and >=, respectively. o IS If VALUE is not set, then IS is checked. IS is allowed to be either "TRUE" or "FALSE". The boolean value of NAME is checked against IS. CHILDREN
None EFFECTS
None DEPENDENCIES
None USAGE
<if name="__ODD__" is="false"> ... Children here </if> In the above example, the children will be executed if the value of __ODD__ (which is set by the LOOP node) is false. So, for all even iterations. AUTHOR
Rob Kinyon (rob.kinyon@gmail.com) SEE ALSO
LOOP, VAR perl v5.14.2 2010-06-17 Excel::Template::Container::Conditional(3pm)
All times are GMT -4. The time now is 08:27 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy