sed 搜索不区分大小写

sed 搜索不区分大小写

在 unix 脚本中,我有一行

sed -i "/$1/s/a/b" filename

这会查找包含字符串 $1 的行(作为参数提供给脚本),并在这些行中将“a”替换为“b”。

我希望对于 1 美元来说不区分大小写。例如,如果 $1 是“foo”,那么我希望替换发生在包含“foo”或“FOO”或“Foo”等的所有行中。执行此操作的最佳方法是什么?

(注意:这篇文章的原始版本省略了代码中的第一个正斜杠,这是理解 Kusalananda 的答案的重要上下文。)

答案1

我假设您的原始sed表达式是/$1/s/a/b/or /$1/ s/a/b/,包括该首字母/字符,否则您将不得不依赖于$1包含首字母/(注意:问题中的表达式在编写此内容后已更正)。此sed命令对由第一个位置参数 给定的特定正则表达式寻址的所有行应用替换$1

的一些实现sed(例如 GNUsedsedmacOS 上可用的实现)可以通过使用(大写 i)标志来使正则表达式地址不区分大小写地匹配I,其方式与如何将标志与命令一起使用s///(例如,s///g)类似。

假设您使用的是sed支持此非标准功能的:

sed "/$1/I s/a/b/" file

a这将用b匹配任何正则表达式的每行替换第一个,$1不区分大小写。

测试:

% set -- foo ; sed "/$1/I s/a/b/" <<'EXAMPLE'
heredoc> FOO a
heredoc> a foo a
heredoc> Fool abba
heredoc> Moose able
heredoc> EXAMPLE
FOO b
b foo a
Fool bbba
Moose able

答案2

好,知道了。 Is而不是s作品。所以固定代码是:

sed -i "/$1/Is/a/b" filename

(这在 t-shell 中适用于我;我还没有测试过它。)

相关内容