I'm trying to use SED to extract text from a log file. I can do a search-and-replace without too much trouble:
sed 's/foo/bar/' mylog.txt
However, I want to make the search case-insensitive. From what I've googled, it looks like appending i
to the end of the command should work:
sed 's/foo/bar/i' mylog.txt
However, this gives me an error message:
sed: 1: "s/foo/bar/i": bad flag in substitute command: 'i'
What's going wrong here, and how do I fix it?
Best Answer
Update: Starting with macOS Big Sur (11.0),
sed
now does support theI
flag for case-insensitive matching, so the command in the question should now work (BSDsed
doesn't reporting its version, but you can go by the date at the bottom of theman
page, which should beMarch 27, 2017
or more recent); a simple example:Note:
I
(uppercase) is the documented form of the flag, buti
works as well.Similarly, starting with macOS Big Sur (11.0)
awk
now is locale-aware (awk --version
should report20200816
or more recent):The following applies to macOS up to Catalina (10.15):
To be clear: On macOS,
sed
- which is the BSD implementation - does NOT support case-insensitive matching - hard to believe, but true. The formerly accepted answer, which itself shows a GNUsed
command, gained that status because of theperl
-based solution mentioned in the comments.To make that Perl solution work with foreign characters as well, via UTF-8, use something like:
-C
turns on UTF-8 support for streams and files, assuming the current locale is UTF-8-based.-Mutf8
tells Perl to interpret the source code as UTF-8 (in this case, the string passed to-pe
) - this is the shorter equivalent of the more verbose-e 'use utf8;'.
Thanks, Mark Reed(Note that using
awk
is not an option either, asawk
on macOS (i.e., BWK awk and BSD awk) appears to be completely unaware of locales altogether - itstolower()
andtoupper()
functions ignore foreign characters (andsub()
/gsub()
don't have case-insensitivity flags to begin with).)A note on the relationship of
sed
andawk
to the POSIX standard:BSD
sed
andawk
limit their functionality mostly to what the POSIXsed
and POSIXawk
specs mandate, whereas their GNU counterparts implement many more extensions.