On Tue, Jul 9, 2013 at 9:37 AM, Nathan Hilterbrand <[email protected]>wrote:
> I want to open a file read+write mode and change
> > the
> > some content in same file without creating another file and copy to it.
>
You might want to look at the perl "in place mode" [1], so something like
perl -i.bak -pe ' s/BLR/bangalore/g;' myfile.txt
will modifiy myfile.txt, as in a while loop (via the -p option:
while (<>) {
s/BLR/bangalore/g;
}
) and, as there a param to the -i option, leave you with the original text
in a myfile.txt.bak file
[1]
perldoc perlrun has
-i[extension]
specifies that files processed by the "<>" construct are to be
edited in-place. It does this by
renaming the input file, opening the output file by the
original name, and selecting that output file
as the default for print() statements. The extension, if
supplied, is used to modify the name of the
old file to make a backup copy, following these rules:
If no extension is supplied, no backup is made and the current
file is overwritten.
If the extension doesn’t contain a "*", then it is appended to
the end of the current filename as a
suffix. If the extension does contain one or more "*"
characters, then each "*" is replaced with the
current filename. In Perl terms, you could think of this as:
($backup = $extension) =~ s/\*/$file_name/g;
This allows you to add a prefix to the backup file, instead of
(or in addition to) a suffix:
$ perl -pi'orig_*' -e 's/bar/baz/' fileA # backup to
'orig_fileA'
Or even to place backup copies of the original files into
another directory (provided the directory
already exists):
$ perl -pi'old/*.orig' -e 's/bar/baz/' fileA # backup to
'old/fileA.orig'
These sets of one-liners are equivalent:
$ perl -pi -e 's/bar/baz/' fileA # overwrite
current file
$ perl -pi'*' -e 's/bar/baz/' fileA # overwrite
current file
$ perl -pi'.orig' -e 's/bar/baz/' fileA # backup to
'fileA.orig'
$ perl -pi'*.orig' -e 's/bar/baz/' fileA # backup to
'fileA.orig'
From the shell, saying
$ perl -p -i.orig -e "s/foo/bar/; ... "
is the same as using the program:
#!/usr/bin/perl -pi.orig
s/foo/bar/;
which is equivalent to
#!/usr/bin/perl
$extension = '.orig';
LINE: while (<>) {
if ($ARGV ne $oldargv) {
if ($extension !~ /\*/) {
$backup = $ARGV . $extension;
}
else {
($backup = $extension) =~ s/\*/$ARGV/g;
}
rename($ARGV, $backup);
open(ARGVOUT, ">$ARGV");
select(ARGVOUT);
$oldargv = $ARGV;
}
s/foo/bar/;
}
continue {
print; # this prints to original filename
}
select(STDOUT);
except that the -i form doesn’t need to compare $ARGV to
$oldargv to know when the filename has
changed. It does, however, use ARGVOUT for the selected
filehandle. Note that STDOUT is restored as
the default output filehandle after the loop.
As shown above, Perl creates the backup file whether or not any
output is actually changed. So this is
just a fancy way to copy files:
$ perl -p -i'/some/file/path/*' -e 1 file1 file2 file3...
or
$ perl -p -i'.orig' -e 1 file1 file2 file3...
You cannot use -i to create directories or to strip extensions from
files.
Perl does not expand "~" in filenames, which is good, since
some folks use it for their backup files:
$ perl -pi~ -e 's/foo/bar/' file1 file2 file3...
Note that because -i renames or deletes the original file
before creating a new file of the same name,
UNIX-style soft and hard links will not be preserved.
Finally, the -i switch does not impede execution when no files
are given on the command line. In this
case, no backup is made (the original file cannot, of course,
be determined) and processing proceeds
from STDIN to STDOUT as might be expected.
--
a
Andy Bach,
[email protected]
608 658-1890 cell
608 261-5738 wk