Date: Tue, 21 Jun 2011 11:00:21 -0400 From: Matthew Pounsett <matt@conundrum.com> To: freebsd-questions@freebsd.org Subject: sed argument processing b0rked? Message-ID: <73E783DC-E32B-4DE3-AFF6-4A75D1D3A00A@conundrum.com>
next in thread | raw e-mail | index | archive | help
I'm running into a weird problem with sed. I believe what I'm trying to = do should work fine, but seem to be stymied by weirdness in sed's = argument processing. This is on 8.2-RELEASE-p2. > which sed /usr/bin/sed According to years of experience and re-reading the man page five times = today this should work, however sed is treating the second -e as a file = name: > sed -i'' -e 's/^\(REVOKE ALL ON SCHEMA public FROM = \)postgres/\1pgsql/' \ ? -e 's/^\(GRANT ALL ON SCHEMA public TO \)postgres/\1pgsql/' = \ ? /tmp/pgdump sed: -e: No such file or directory If I drop the second -e it seems to work (the permission denied is = expected): > sed -i'' -e 's/^\(REVOKE ALL ON SCHEMA public FROM = \)postgres/\1pgsql/' \ ? /tmp/pgdump sed: /tmp/pgdump: Permission denied This is contrary to the sed man page: A single command may be specified as the first argument to sed. = Multiple commands may be specified by using the -e or -f options. All = commands are applied to the input in the order they are specified regardless = of their origin. I thought maybe it was an argument order problem, since -i is listed = after -e in the syntax synopsis (sometimes that matters) but that is = actually even weirder: sed -e 's/^\(REVOKE ALL ON SCHEMA public FROM \)postgres/\1pgsql/' \ -e 's/^\(GRANT ALL ON SCHEMA public TO \)postgres/\1pgsql/' \ =20= -i'' /tmp/pgdump sed: -I or -i may not be used with stdin Fiddling around some more, I found that -e can't be supplied for the = first command if there are multiple commands to be given.. but it does = work if there's only one. That doesn't seem right. sed -i'' 's/^\(REVOKE ALL ON SCHEMA public FROM \)postgres/\1pgsql/' \ -e 's/^\(GRANT ALL ON SCHEMA public TO \)postgres/\1pgsql/' = \ /tmp/pgdump sed: /tmp/pgdump: Permission denied However, that breaks again if -i is moved: > sed 's/^\(REVOKE ALL ON SCHEMA public FROM \)postgres/\1pgsql/' \ -e 's/^\(GRANT ALL ON SCHEMA public TO \)postgres/\1pgsql/' \ -i'' /tmp/pgdump sed: -e: No such file or directory sed: s/^\(GRANT ALL ON SCHEMA public TO \)postgres/\1pgsql/: No such = file or directory sed: -i: No such file or directory sed: /tmp/pgdump: Permission denied I'm fairly certain this has worked the way I'm expecting it to in the = past. After all, I wrote it this way out of habit. Either way, it = seems to me that argument processing in the current sed distributed with = the OS is broken with respect to the way it's documented. Or am I = missing something?
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?73E783DC-E32B-4DE3-AFF6-4A75D1D3A00A>