如何使这个sed替换案例不敏感

时间:2016-04-20 16:46:24

标签: sed case-insensitive

我需要修改一个脚本,我需要在"开始"的第一个匹配之前添加一行。带有字符串的语句"一些文字"在自己的路线上。以下命令可以完成这项工作,但我无法弄清楚如何使它不区分大小写:

sed -i '0,/begin/s//some text\nbegin/' filename

这失败了:

sed -i '0,/begin/s//some text\nbegin/i' filename

...错误sed: -e expression #1, char 45: cannot specify modifiers on empty regexp

如何使这个替换案例不敏感?

1 个答案:

答案 0 :(得分:1)

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

$ printf 'Text\nBegin\n' |sed '0,/begin/I s//some text\nbegin/'
Text
some text
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
}'

或者,更简洁(帽子提示到Etan Reisner):

sed '0,/.*begin/I s//some text\n&/'

这会捕获包含begin的行中的所有内容,并插入"某些文字"在匹配的字符串之前使用换行符,保留该行上可能存在的内容。