#!/usr/bin/env lua51 --[[ gsub.lua - answer the lines from stdin that match a certain pattern, transforming them in a certain way. Usage: gsub.lua gsub.lua -f Author: Eduardo Ochs Version: 2006jul07 Public Domain. # # Example 1: # (find-fline "~/o") cat /var/lib/dpkg/info/manpages-dev.list \ | gsub.lua '/usr/share/man/man3/(.+)%.3%.gz' '# (find-man "3 %1")' \ | sort | tee ~/o # # Example 2, 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; tremove(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