Page 1 of 1
LUA script to global search and replace
Posted: Thu Nov 08, 2012 8:57 pm
by mahub
Need some assistance creating a lua script to do multiple global replace on multiple strings. Not programmers but do have half a brain. Any help is greatly appreciated.
Posted: Thu Nov 08, 2012 9:37 pm
by jussij
Need some assistance creating a lua script to do multiple global replace on multiple strings.
I am happy to try and help but you are need to going to be a bit more specific.
Are you do the search and replace over a single file or multiple files
If it is multiple files, how are you deciding which files need to be processed
When you say multiple strings, are the search and replace patterns fixed and if so what is an example of one such typical pattern
If these patterns are not fixed where are you planning on getting them from
The difficulty is there are so many ways to achieve this and depending on answers to the questions above will determine which of these many approaches is the easiest.
Finally, if you need to do
tens or
hundreds of individual search and replace actions then it might be better to use a tool like
SED to do this work.
It is easy to run tools from inside Zeus macros, so it might be a good idea to write a simple macro that just runs SED and lets SED do all the heavy lifting.
Cheers Jussi
Posted: Tue Nov 13, 2012 9:08 pm
by mahub
One file at a time.
Most fixed. Example LA_ replace with NY_.
Thanks for all your help.
Posted: Tue Nov 13, 2012 10:12 pm
by jussij
One file at a time.
In that case this is fairly straight forward.
The simplest way to do this is as follows:
Code: Select all
function key_macro()
use_regexp = 0
screen_update_enable()
-- replace all text in current document
replace_all("LA_", "NY_", use_regexp)
screen_update()
search_options_restore()
end
key_macro() -- run the macro
But you could also implement this using this more long winded approach:
Code: Select all
function replace_text(search, replace)
-- set the search and replace details
set_find_text(search)
set_replace_text(replace)
-- replace all the items in the document
while ReplaceNext() > 0 do
end
end
function key_macro()
screen_update_disable()
-- save current search settings
search_options_save()
-- different scope options
SCOPE_FORWARD = 0
SCOPE_REVERSE = 1
SCOPE_MARKED = 2
SCOPE_ENTIRE = 3
SCOPE_ALL = 4
-- set the search options
set_search_option("Scope" , SCOPE_ALL)
set_search_option("UseCase" , 0)
set_search_option("WholeWord" , 0)
set_search_option("RegExpress", 0)
-- replace all text in current document
replace_text("LA_", "NY_")
search_options_restore()
screen_update_enable()
screen_update()
end
key_macro() -- run the macro
Cheers Jussi
Thanks
Posted: Wed Nov 14, 2012 4:21 pm
by mahub
Thanks so much. I will give it a try.
Follow Up
Posted: Wed Nov 14, 2012 4:54 pm
by mahub
Can you instruct me how to do it for multiple open files please?
Thanks
Posted: Wed Nov 14, 2012 10:44 pm
by jussij
Can you instruct me how to do it for multiple open files please?
The macro below will do the replace across all open, named document files.
Code: Select all
function key_macro()
screen_update_disable()
screen_update_enable()
use_regexp = 0
delimiter = '|'
FULL_DETAILS = 1
-- get all current document files delimited by the pipe character
all_files = document_files(FULL_DETAILS, delimiter)
current_window = get_window_id()
-- split the all the files into their individual file names
for file_name in string.gmatch(all_files, "([^|]*)|?" ) do
-- activate the file window
if window_activate_name(file_name) then
-- replace the text in current document
replace_all("LA_", "NY_", use_regexp)
end
end
-- restore the original window
window_activate(current_window)
screen_update()
end
key_macro() -- run the macro
Cheers Jussi