I need to insert a line with specific text on the second line (thus moving the other lines down in the file) of hundreds of files in a directory. Any quick Unix tips on how that can be done?
+10
A:
sed -i -e '2iYour line here' /dir/*
Note that sed -i
semantics vary by Unix flavor, so check your man sed
. This is written for the GNU flavor.
chaos
2009-08-05 12:25:04
wow .. almost makes me want to learn sed. Thanks a bunch!
Learning
2009-08-05 12:54:36
+1
A:
this is an AWK
use rather than the sed
,
for i in $(<list_of_files)
do
awk '{if (FNR!=2) print $0;
else { print "new line"; print $0}}' $i > ${i}.tmp;
mv ${i}.tmp $i;
done
nik
2009-08-05 12:28:42
A:
ls | xargs --replace=foo perl -i -ne 'print; print "second line text\n" unless $x++;' foo
I vote *never* to recommend `perl -i` without a backup: `perl -i.bak`. It's easy, and you can easily remove the backups once you're sure you didn't get your edit wrong.
Telemachus
2009-08-05 22:51:56
+2
A:
perl -pi -we'print "extra line\n" if $. == 3; close ARGV if eof' files
The close(ARGV)
is necessary to restart the line counter $.
at the beginning of each file; by default, it counts lines across files.
ysth
2009-08-05 22:48:32
Don't you think it's worth doing `-i.bak` to protect you from a typo wiping out quite a lot of data? (Just imagine you forget `-p`.)
Telemachus
2009-08-05 22:50:52
@Telemachus: when doing a whole directory, I prefer to copy the whole directory first (e.g. cp -a dir{,.save}); then I can mv it back if needed.
ysth
2009-08-05 23:14:12