-
Batch edit files
Ok quick ques (2 today from me oO)
once again am going back to site have/am designing.
I want to change an element of each page - the code for each os the same
basically it will be a straight find/replace on each page
the code to be replaced is the same on each page as is the new code am writing in its place.
Now i could go through each page 1 at a time and do a ctrl+h but that would take a while. Is there anyway to automate it?
Like a program i could load all the files that need changed into specify the text to find what to replace it with and let it do the hard work?
v_Ln
-
oh one thing i forgot to add - have tried some search/replace programs which handle multiple files but my problem is that the text
Code:
<div id="container">
<div id="menu">
<a href="index.php">Home</a>
<a href="lab.php">The Lab </a>
<a href="archive.php">Archives</a>
<a href="digiart.php">Digiart</a>
<a href="b3ta.php">b3ta</a>
<a href="photos.php">Photos</a>
<a href="contact.php">Contact</a></div>
stretches over multiple lines and most only aloow me to paste in the code up until the first 'return'
v_Ln
-
Hi valhallen
In the past, before php, dreamweaver and such, I did create
a small c program, which more or less does what you want to do
now. Find it attached (compiles as well under linux as windows).
But - before you use it: create a backup (the program itself
creates a backup before changing the files, but one never knows...)!
I am not aware of some tools or scripts existing which are doing
this. To write a script takes quite some effort, I think (hence, a
c (or perl) program).
Nowadays, if php is enabled, I would do the following, for future
references:
1) store that whole navigation part in a file "navigation.php"
2) change the text in the files to
Code:
<?php
include ('navigation.php');
?>
3) In case of any upcoming change, you have to change one file only.
Cheers
-
What I would suggest is that if you have code that repeats (such as a menu that appears on many pages), you could always separate it out and do an include statement in your html files (forgot the syntax, it's been years!). Not only does this make it more modular and easier for you to change things in the future, it is nowadays considered proper html coding.
You can check out many sites to see how this can be done:
www.w3schools.com
www.devguru.com (my personal favourite)
... and pretty much any html tutorial site that explains some CSS will help you.
hope this helps.
-ik
-
I think you mean the php include(); function..
Btw, V_Ln if you need it bad, see me in IRC tomorrow, I'll whip you up a bash+sed script to do the job..
-
thanks for the replies guys
as for the php includes - thats what am trying to replace it with - lol
i noramlly do code all static elements which are seen on every page (like navigation) as a sperate file which is pulled in at runtime....but i didn't this time as I didn't foresee the site being all that large - guess who was wrong! So i thought I'd better do it now before it got any bigger - lol
will take a look at your prog hopefully tomorrow sec - thanks
v_Ln
-
By popular request..
Code:
#!/bin/bash
# Bash multi line remove and replace with new line(s)..
# Will seek first instance of end starting with start.
# Creates filename.bak backup file.
#
# (c) 2005 Anne Jan Brouwer (the_JinX[at]etv.cx)
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# http://www.gnu.org/copyleft/gpl.html
# Define Start element for replace
start='<div id="container">'
# Define End element for replace
end='</div>'
# Replacement string (can be multiline)
replace="<?php
include( newstuff.php );
?>"
if [[ $* == "" ]]
then
echo "Usage: $0 file(s)"
exit 1
fi
# setup integers
declare -i startline
declare -i endline
declare -i tail
declare -i eof
for phpfile in $*
do
if [[ `grep "$start" "$phpfile"` ]]
then
mv "$phpfile" "$phpfile.bak"
eof=`wc -l "$phpfile.bak" | sed -e "s/$phpfile.bak//"`
startline=`/usr/bin/grep -nm1 "$start" "$phpfile.bak" | cut -d ":" -f 1`
let "startline = $startline - 1"
head -n $startline "$phpfile.bak" > "$phpfile"
echo "$replace" >> "$phpfile"
let "tail = $eof - $startline"
tail -n $tail "$phpfile.bak" > "$phpfile.tmp"
endline=`/usr/bin/grep -nm1 "$end" "$phpfile.tmp" | cut -d ":" -f 1`
eof=`wc -l "$phpfile.tmp" | sed -e "s/$phpfile.tmp//"`
let "tail = $eof - $endline"
tail -n $tail "$phpfile.tmp" >> "$phpfile"
rm "$phpfile.tmp"
else
echo "'start' not found, skipping $phpfile..."
fi
done
Asuming you called it modify and did a chmod +x modify
You could use it like this..
./modify index.php otherfile.php /home/myhome/www/yetanotherfile.php
It does have a tiny bit of error handling (skip and warn if 'start' isn't found)..
-
I got a pm about this script giving errors when the start delimiter is found more then once in a file..
The error is in line
Code:
startline=`/bin/grep -n "$start" "$phpfile.bak" | cut -d ":" -f 1`
A fix for this would be grep -nm1 instead of -n limiting the output to one (the first) instance..
In which case only the first instance of the start delimiter will ne used.
(edited previous post, but wanted to let you know about my mistake ;))
Bounds checking is vital.. even in scripts (especialy in scripts ??)
-
I'm disappointed the_JinX... :) You promised us a bash+sed script and then came up with bash only solution.
Code:
$ sed -i.old '/.*<div id="container">$/,/.*<\/div>$/c<?php\
include( newstuff.php );\
?>' file1 file2 file3 ...
I'm not sure which platform you're using val, but I tested it on cygwin using GNU sed. It even make a backup before doing the replacement.
Peace always,
<jdenny>
-
Nice one, jdenny..
But mine is bigger then yours :p
For some reason that kind of logic just doesn't work on scripts ;)
I was under the assumption that sed wouldn't work on multi-line stuff, since it evaluates one line at a time..
Will have to read up on sed though... (insight welcome)..