in reply to Replacing text inside lots of files

perl -i~ -pe 'if($ARGV ne $l){$f=$l=$ARGV;$f=~s/\.wra//;substr($_,-11)=$f.$/;}' *

OK, that looks crazy, I'm sure. Here's what's happening:

  • -i~ is doing an in-place edit of each file, and creating a backup extension of ~. That's in case there are mistakes in the code.
  • -pe is going to cycle through each line of each file, and print the contents of $_ at the end of the expression.
  • $ARGV is the name of the current file being looked at. The "if" statement checks to see when a new file is opened. When that happens, $_ is the first line of the new file.
  • $f is the filename without the .wra extension after the regular expression s/\.wra//.
  • The "substr($_,-11)=$f.$/" expression takes the last 11 characters of the first line (including the \n at the end) and replaces it with the contents of $f and another \n.
  • The asterisk at the end means each file in the current directory is going to be passed to the script. You may want to replace that with *.wra
  • Replies are listed 'Best First'.
    Re: Re: Replacing text inside lots of files
    by harald (Initiate) on Nov 03, 2003 at 09:29 UTC
      When I use this example for the problem, I get the error "Modification of a read-only value attempted at -e line 1, <> line 1." and the file is empty. Where do I make a mistake ? I used this example in a DOS-Box of WIN2k and also LINUX. Thanks for helping...
        You may have replaced $l (el) with $1 (one). $1 (one) is a reserved variable for Perl that catches parts of regular expression, and can't be assigned to directly. For example:

        ~/test$ perl -e '$1 = "blah"' Modification of a read-only value attempted at -e line 1.

        Whereas :

        ~/test$ perl -le '$var = "blah"; $var =~ /^(....)$/; print $1' blah