From http://www.itworld.com/nl/unix_sys_adm/09252002/
”
perl -i -p -e s/floor/hamper/ig $file
perl -i -p -e ‘s/hamper = no/hamper = yes/’ $file
perl -i -p -e ‘s/floor\s+yes/floor\tno/’ $file
perl -i.bak -p -e s/floor/hamper/ig $file
Each of these commands edits the file referenced by $file “in place”. That is, it doesn’t create another file. It opens the file read/write and makes the change requested with no changes to the file except the one intended.
The -i argument tells Perl to make the change in-line using the file for both reading and writing. This is routine for Perl. If a -i is followed by a file extension (as shown in the 4th example above), a backup of the file is created before the program is run.
The -p tells perl to assume a loop around the one-line program and to echo the output.
The -e specifies that the one-line program is coming next. In all of our examples, we’ve provided a sed-like change command.
Now let’s look at how Perl substitutions work.
The leftmost expression in a s/this/that/ command can be anything from an exact match to a fuzzy match. We can match literally on the word “this” or we can match on any word that starts with t or any four-letter word if we want to. It all depends on the expression that we use. The rightmost expression is always exact, of course. In an odd sort of way, a Perl substitute command is like me asking my stepkid to pick up the clothing from her floor and put it in her hamper. If I were too exact when I told her what to pick up, she would pick up only that. If I were not precise on what I wanted her to do with the clothes she picked up, they’d probably end up under the bed or on the floor of her closet. Clearly we need to match on clothing anywhere on the floor and specify the exact destination as the hamper.
perl -i -p -e s/floor/hamper/ig $file
In this particular example, we’ve simply changed “floor” to “hamper”.
perl -i -p -e ‘s/hamper = no/hamper = yes/’ $file
In this example, we’ve included more complex strings. No problem.
perl -i -p -e ‘s/floor\s+yes/floor\tno/’ $file
This example is a bit more interesting. We’ve matched on “floor” followed by white space, followed by “yes” and changed it to “floor” followed by a tab followed by “no”.
perl -i.bak -p -e s/floor/hamper/ig $file
If we include an file extension as shown in the line above, we’d be left with a file called $file.bak containing the original text. This is a good idea if you might have unwanted side effects. The “ig” at the end specifies that we’re ignoring case and changing every instance of the word that appears in each line (not just the first). Ignoring case it itself a big time saver in many situations.
For “zapping” files, Perl is hard to beat.
“