我需要修改一个脚本,我需要在"开始"的第一个匹配之前添加一行。带有字符串的语句"一些文字"在自己的路线上。以下命令可以完成这项工作,但我无法弄清楚如何使它不区分大小写:
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
如何使这个替换案例不敏感?
答案 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
的行中的所有内容,并插入"某些文字"在匹配的字符串之前使用换行符,保留该行上可能存在的内容。