在 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
(例如 GNUsed
和sed
macOS 上可用的实现)可以通过使用(大写 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 中适用于我;我还没有测试过它。)