El Wednesday 13 August 2008 22:45:46 tony va escriure:
> Hello,
>
> gnu grep -C allows for output in context to the matched line
> is there an updated way to do this in perl using $. == $linenumber +
> context?
> I looked into the other thread that mentioned it, but none of the
> scripts worked.
>
> I tried the -00 switch and regex backreferences with $1, etc but
> thought there must be an easier way.
> more importantly,
> Is there a way to use such a match as the replacement pattern for a
> different line?
>
> Ideally the substitution would be like:
> $. == $matchedLineNumber +/- $contextNumber and s/$patternInMatched/
> $newPattern/ and print $_;
>
> Here's an example:
>
> I want to edit specific lines in a file using an array of the specific
> line numbers.
> But I don't know how to reference an element of the array when I use
> an implicit loop of the lines in the file from the -p or -n switch.
>
> print line numbers and lines of the file, test.txt
>
> $ perl -wnl -e 'print "$. $_";' test.txt
> 1 animal cat
> 2 tag this line
> 3 animal dog
> 4 tag this line
> 5 animal cat
> 6 tag this line
> 7
>
> I want to substitute a string in the lines with 'tag' with the
> replacement string from the previous line something like:
>
> long way
>
> # get the line numbers of the lines you want the substitution to occur
> $ perl -wnl -e '/tag/ and print "$. $_";' test.txt
> 2 tag this line
> 4 tag this line
> 6 tag this line
>
> #then code a substitution line for each line; manually looking at
> previous line
>
> #!/usr/bin/env perl -i.old -wpl
> $. == 2 and s/this line/cat animal/;
> $. == 4 and s/this line/dog animal/;
> $. == 6 and s/this line/cat animal/;
>
> instead I want to use an array and loop over the lines in the file
> rather than line by line, but
> if <STDIN> is in the implicit array from the -p switch, how do I
> reference it?
>
>
> #!/usr/bin/env perl -i.old -wpl
> @array = (2,4,6)
> $. = $array[what goes here?] and s/this line/cat animal/
>
> I also tried
>
> #!/usr/bin/env perl -i.old -wpl
> @array = (2,4,6)
> while (<>){
>       $. = $array[what goes here?] and s/this line/cat animal/
> }
>
> it will work if I specify one line at a time as an argument and I know
> beforehand that the line in context is +1 from the matched line:
>
> #!/usr/bin/env perl -s -i.old -wpl
> # beforehand find all line numbers that have the pattern
> BEGIN {
>       $ln or warn "Enter line: $0 -ln\n" and exit 255
> }
>       # sample nearby -1 lines that need substitution @lines =
> (7303,7309,7315,7321,7327,7333,7339,7345,7351,7357,7363,7369,7375,7381,7387
>,7393,7399,7405,7411,7417,7423,7429,7435,7441,7447,7453,7459,7465,7471,7477,
>7483,7489,7495,7501,7507,7513,7519,7525,7531); $. == $ln + 1 and s/this
> line/$pattern/g;
>
> Any thoughts or suggestions appreciated!
>
> Best,
> tony

maybe you can use match operator (m//) and automatic memories assigned to 
variables (if you want to keep the former value of last expressions) for that 
purpose.

-- 
Xavier Mas

                
______________________________________________ 
LLama Gratis a cualquier PC del Mundo. 
Llamadas a fijos y móviles desde 1 céntimo por minuto. 
http://es.voice.yahoo.com


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to