不区分大小写的search和replacesed

我正在尝试使用SED从日志文件中提取文本。

我可以做一个search和replace,没有太多的麻烦:

sed 's/foo/bar/' mylog.txt

但是,我想使search不区分大小写。 从我GOOGLE了,它看起来像追加“我”的命令应该工作结束:

sed 's/foo/bar/i' mylog.txt

但是,这给了我一个错误消息:

sed: 1: "s/foo/bar/i": bad flag in substitute command: 'i'

这里怎么回事,我该如何解决?

我在OS X上,以防万一。

要清楚的是:在macOS(OS X)上 – 从Sierra(10.12)开始 – sed这是BSD的实现 – 不支持不区分大小写的匹配 – 很难相信,但是是正确的。 以前接受的答案本身显示了一个GNU sed命令,因为在评论中提到的基于perl的解决scheme而获得了这个地位。

为了使Perl解决scheme也可以使用外来字符 ,通过UTF-8,使用如下所示:

 perl -C -Mutf8 -pe 's/öœ/oo/i' <<< "FÖŒ" # -> "Foo" 
  • -C打开对stream和文件的UTF-8支持,假定当前的语言环境是基于UTF-8的。
  • -Mutf8告诉Perl将源代码解释为UTF-8(在这种情况下,将string传递给-pe ) – 这是更详细的-e 'use utf8;' – 谢谢,@Mark Reed。

(请注意, 使用awk也不是一个选项 ,因为OS X上的awk (即BWK awk ,又名BSD awk )似乎完全不知道locales – 它的tolower()toupper()函数忽略外部字符(和sub() / gsub()不具有区分大小写标志)。)

大写'我'。

 sed 's/foo/bar/I' file 

另一个解决Mac OS X上的sed是从MacPorts或HomeBrew安装gsed,然后创build别名sed='gsed'

sed的Mac版本似乎有限。 解决这个问题的一个方法是使用一个linux容器(通过Docker),它有一个可用的sed版本:

 cat your_file.txt | docker run -i busybox /bin/sed -r 's/[0-9]{4}/****/Ig' 

我有类似的需求,并提出这个问题:

这个命令简单地find所有的文件:

 grep -i -l -r foo ./* 

这一个排除this_shell.sh(如果你把这个命令放在一个名为this_shell.sh的脚本中),请将输出发送到控制台以查看发生了什么,然后使用sed对每个find的文件名进行replace:

 grep -i -l -r --exclude "this_shell.sh" foo ./* | tee /dev/fd/2 | while read -rx; do sed -b -i 's/foo/bar/gi' "$x"; done 

我select了这种方法,因为我不喜欢为未修改的文件更改所有时间戳。 提供grep结果只允许查看具有目标文本的文件(因此可能也可以提高性能/速度)

请务必在使用前备份您的文件和testing。 可能无法在某些环境中使用embedded空格的文件。 (?)

如果你正在做模式匹配,例如/ pattern / s / xx / yy / g

那么你想把模式/图案/ Is / xx / yy / g之后的“I”

例如:echo Fred | sed'/ fred / Is // willma / g'will will willma … without the I returns string untouch(Fred)

sed's / string1 / string2 / Ig'Capital I是一个选项,可以用来searchstring,而不考虑区分大小写。