删除包含不区分大小写的匹配项的行

删除包含不区分大小写的匹配项的行

我有一个包含如下信息的文件:

20    BaDDOg
31    baddog
42    badCAT
43    goodDoG
44    GOODcAT

我想删除所有包含单词 的行dog。这是我想要的输出:

42    badCAT
44    GOODcAT

然而, 的大小写dog不敏感。

我以为我可以使用 sed 命令:sed -e "/dog/id" file.txt,但我似乎无法让它工作。这与我在 OSX 上工作有什么关系吗?我还可以使用其他方法吗?

答案1

尝试grep

grep -iv dog inputfile

-i忽略大小写并-v反转匹配。

如果你想使用sed你可以这样做:

sed '/[dD][oO][gG]/d' inputfile

GNUsed扩展模式匹配使用I修饰符,这应该使匹配大小写不敏感,但这并不适用于所有风格的sed.对我来说,这有效:

sed '/dog/Id' inputfile

但它不能在 OS X 上运行。

答案2

OSX版本sed不兼容 GNU;i正如您在手册页中看到的那样,它完全错过了标志:

The value of flags in the substitute function is zero or more of the following:
   N       Make the substitution only for the N'th occurrence of the regular expression in
           the pattern space.
   g       Make the substitution for all non-overlapping matches of the regular expression,
           not just the first one.
   p       Write the pattern space to standard output if a replacement was made.  If the
           replacement string is identical to that which it replaces, it is still considered
           to have been a replacement.
   w file  Append the pattern space to file if a replacement was made.  If the replacement
           string is identical to that which it replaces, it is still considered to have
           been a replacement.

您可以gsed使用安装酿造用命令

brew install gnu-sed

然后您可以将 sed 与不区分大小写的标志一起使用,如下所示:

gsed '/dog/Id' inputfile

答案3

由于 OSX 似乎已经编辑了,基于https://ss64.com/osx/,您可以要求它删除任何与“dog”匹配的行。不幸的是,您必须自己区分大小写:

ed -s file.txt <<< $'1,$g/[dD][oO][gG]/d\nw\nq'

该命令在此处字符串中给出,并分解为以下序列:

  • 在地址范围内1,$(整个文件)
  • g-- 对与即将到来的正则表达式匹配的行全局应用后续命令
  • /[dD][oO][gG]/-- 匹配“dog”,不区分大小写
  • d-- 应用的命令是“删除”
  • w-- 将更新的文件写入磁盘
  • q-- 退出

相关内容