我有一个包含如下信息的文件:
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
-- 退出