Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
#!/usr/bin/env lua5.1 -- This file: -- http://angg.twu.net/bin/gsub.lua.html -- http://angg.twu.net/bin/gsub.lua -- (find-angg "bin/gsub.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- Version: 2006jul07 (but some comments were changed later). -- Public Domain. -- gsub.lua - a grep with substitutions, Lua-style. -- For each line from stdin that matches the lua pattern <pat>, -- print the result of string.gsub(line, pat, repl). -- Usage: -- gsub.lua <pat> <repl> -- gsub.lua -f <pat> <repl_function> -- -- The default behavior is to interpret <repl> as a string. -- However, if `-f' is given, first convert the string -- <repl_function> to a function, with: -- -- repl = assert(loadstring("return "..repl_function))() -- -- and then do the same as before, i.e.: -- for each line from stdin that matches the lua pattern <pat>, -- print the result of string.gsub(line, pat, repl). -- According to the Lua manual: -- (find-luamanualw3m "#pdf-string.gsub") -- -- If repl is a string, then its value is used for replacement. The -- character % works as an escape character: any sequence in repl of -- the form %n, with n between 1 and 9, stands for the value of the -- n-th captured substring (see below). The sequence %0 stands for -- the whole match. The sequence %% stands for a single %. -- -- If repl is a function, then this function is called every time a -- match occurs, with all captured substrings passed as arguments, -- in order; if the pattern specifies no captures, then the whole -- match is passed as a sole argument. -- -- If the value returned by the table query or by the function call -- is a string or a number, then it is used as the replacement -- string; otherwise, if it is false or nil, then there is no -- replacement (that is, the original match is kept in the string). --[[ * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) # Example 1: # function c () { cat <<' ---' Replace UPPERCASE WORDS in this line but not in this thisone On this one too and in THIS ONE too --- } c | gsub.lua '[A-Z]+' '<%0>' c | gsub.lua '(([A-Z])[A-Z]*)' '<%2:%1>' c | gsub.lua '^(([A-Z])[A-Z]*)' '<%2:%1>' c | gsub.lua -f '(([A-Z])[A-Z]*)' 'PP' # Example 2: # # (find-fline "/var/lib/dpkg/info/manpages-dev.list") function c () { cat /var/lib/dpkg/info/manpages-dev.list } c | gsub.lua '/usr/share/man/man3/(.+)%.3%.gz' '# (find-man "3 %1")' c | gsub.lua '.*/man3/(.+)%.3%.gz' '# (find-man "3 %1")' c | gsub.lua '.*/man3/(.+)%.3%.gz' '# (find-man "3 %1")' | sort c | gsub.lua 'man3/(.+)%.3%.gz' '# (find-man "3 %1")' | sort # Example 3: # cd ~/e/ && ls *.e cd ~/e/ && ls *.e | gsub.lua '%.e' 'HELLO' cd ~/e/ && ls *.e | gsub.lua '^(.-)%.e$' '<%1>' cd ~/e/ && ls *.e | gsub.lua '^(.-)%.e$' '# (find-esfile "%1.e" "no sense.")' cd ~/eev-current/ && 'ls' *.el | gsub.lua '.+' '# (find-eevfile "%0")' # Example 4, using "-f": # # http://www.freedb.org/freedb/rock/cf0d740f # (find-angg ".zshrc" "cddb2rentracks") gsub.lua -f \ 'TTITLE([0-9]+)=(.*)' \ 'function (n, name) return format("renwav %02d %s", n+1, string.lower(gsub(name, "[ \039]", "_"))) end' \ < $S/http/www.freedb.org/freedb/rock/cf0d740f # See also: # (find-blogmefile "blogme.lua" "eval =") # (find-angg "LUA/lua50init.lua" "compat") # table.remove --]] if arg[1] == "-f" then p2isfunction = true; table.remove(arg, 1) end -- Hack: '' as the first argument becomes '^(.*)$' - "use the whole line" if arg[1] == "" then arg[1] = "^(.*)$" end p1 = arg[1] p2 = arg[2] eval = function (body) return assert(loadstring(body))() end expr = function (body) return assert(loadstring("return "..body))() end if p2isfunction then p2 = expr(p2) end for li in io.lines() do local newli, n = string.gsub(li, p1, p2) if n > 0 then print(newli) end end -- Local Variables: -- coding: utf-8-unix -- End: