tony wrote: > > 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!
Your description of what you want to do is very unclear. First you say you want to - You can't assign to $. It's a read-only variable that holds the number of the lines read from the file handle you most recently accessed. - <STDIN> isn't an implicit array. Where did you read that? It's a read operattion on the STDIN file handle. The part I do understand is > I want to substitute a string in the lines with 'tag' with the replacement > string from the previous line Does this program help? Rob use strict; use warnings; my $prev = ''; while (<DATA>) { chomp; if (/tag/) { s/this line/$prev/; } else { $prev= $_; } print "$_\n"; } __END__ animal cat tag this line animal dog tag this line animal cat tag this line -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/