如何使此sed替换不区分大小写

如何使此sed替换不区分大小写,sed,case-insensitive,Sed,Case Insensitive,我需要修改一个脚本,并且我需要在“begin”语句的第一个匹配之前添加一行,在它自己的行中添加字符串“sometext”。下面的命令执行此任务,但我不知道如何使其不区分大小写: sed -i '0,/begin/s//some text\nbegin/' filename 这失败了: sed -i '0,/begin/s//some text\nbegin/i' filename …出现错误sed:-e表达式#1,char 45:无法在空regexp上指定修饰符 如何使此替换不区分大小写?您

我需要修改一个脚本,并且我需要在“begin”语句的第一个匹配之前添加一行,在它自己的行中添加字符串“sometext”。下面的命令执行此任务,但我不知道如何使其不区分大小写:

sed -i '0,/begin/s//some text\nbegin/' filename
这失败了:

sed -i '0,/begin/s//some text\nbegin/i' filename
…出现错误
sed:-e表达式#1,char 45:无法在空regexp上指定修饰符


如何使此替换不区分大小写?

您使用的地址范围包括第0行,因此我猜您使用的是GNU sed。在这种情况下,地址中使用的正则表达式有一个扩展,即
I
修饰符:

$ printf 'Text\nBegin\n' |sed '0,/begin/I s//some text\nbegin/'
Text
some text
begin
这不区分大小写,但始终插入小写的“begin”。为了避免更改它,您可以使用

$ printf 'Text\nBegin\n' | sed '/begin/I i some text'
/begin/I
不区分大小写进行匹配,
I
在匹配行之前的单独一行插入其后面的文本

要确保这只修改第一个实例(如示例中所示),可以再次将其与地址范围组合:

printf 'Text\nBegin\n' | sed '0,/begin/I{/begin/I i some text
}'
Sed对
i
和带大括号的换行符有点挑剔,因此似乎需要插入实际的换行符。经典的方法是将
i
命令的参数放在完全独立的行上:

sed '0,/begin/I{
/begin/I i\
some text
}'
或者,简短者(帽尖至):


这将捕获包含
begin
的行中的所有内容,并在匹配的字符串前插入带有换行符的“某些文本”,保留该行中可能已经存在的内容。

您使用的是哪个OS/distribution和sed版本?@Cyrus如果0地址有效,我认为GNU使用了。@BenjaminW:捕捉得好。我认为重点是插入匹配的正确大小写的
begin
。这意味着这将是
/\(begin\)/
,然后
一些文本\n&
@EtanReisner我现在添加了另一个解决方案。我认为只要
sed'0,/\(begin\)/I//一些文本\n&/'
就可以满足您的需要。@EtanReisner这更优雅。我能看到的唯一区别是,
I
版本保留了包含
begin
的行,而替换版本至少包含了前导空格(或者在同一行上的
begin
之前的任何内容),如果需要,可以添加到匹配中。我要补充一点。
sed '0,/.*begin/I s//some text\n&/'