苏玛莉
GNU语法:
sed '/claudio/{s//claudia/;:p;n;bp}' file
甚至(仅使用一次要替换的单词:
sed '/\(claudi\)o/{s//\1a/;:p;n;bp}' file
或者,使用POSIX语法:
sed -e '/claudio/{s//claudia/;:p' -e 'n;bp' -e '}' file
可在任何sed上运行,仅处理所需的行即可找到第一行claudio
,即使claudio
在第一行中也可运行,并且由于仅使用一个regex字符串而更短。
详情
要仅更改一行,您只需要选择一行。
使用1,/claudio/
(从您的问题中)选择:
- 从第一行开始(无条件)
- 到包含字符串的下一行
claudio
。
$ cat file
claudio 1
antonio 2
claudio 3
michele 4
$ sed -n '1,/claudio/{p}' file
claudio 1
antonio 2
claudio 3
要选择包含的任何行claudio
,请使用:
$ sed -n `/claudio/{p}` file
claudio 1
claudio 3
要仅选择文件中的第一个 claudio
,请使用:
sed -n '/claudio/{p;q}' file
claudio 1
然后,您只能在该行上进行替换:
sed '/claudio/{s/claudio/claudia/;q}' file
claudia 1
即使只有第一行的正则表达式匹配项在匹配正则表达式的第一行中发生变化,它也只会更改该行的第一个匹配项。
当然,/claudio/
正则表达式可以简化为:
$ sed '/claudio/{s//claudia/;q}' file
claudia 1
然后,唯一缺少的是打印所有其他未修改的行:
sed '/claudio/{s//claudia/;:p;n;bp}' file
info sed
:(0,/REGEXP/
:0行号可以像一个地址规范使用0,/REGEXP/
,这样sed
会尽量在第一行输入匹配REGEXP太换句话说,。0,/REGEXP/
是与相似1,/REGEXP/
,不同之处在于,如果ADDR2匹配输入的第一行,则0,/ REGEXP /格式将认为它结束了范围,而1,/ REGEXP /格式将匹配其范围的开始并因此使范围跨度直到正则表达式的第二次出现)