sed可通过地址定界实现行内精确替换,如'1s/apple/orange/1'仅替换第一行首个匹配项,'1s/apple/orange/2'替换首个apple后的第二个,未匹配则不替换,加-i可直接修改原文件。

直接用地址定界加替换命令即可,比如只对第一行中首次出现的“apple”替换成“orange”:
指定行内第n次匹配替换
语法结构是:sed '1s/原字符串/新字符串/数字' 文件名
其中 1 表示第一行,s 是替换命令,末尾的数字(如 1、2、3)代表该行内第几次匹配才替换。
- 只替换第一行中第1个“apple”: sed '1s/apple/orange/1' file.txt
- 只替换第一行中第2个“apple”: sed '1s/apple/orange/2' file.txt
- 若该行没有第2个“apple”,则不发生替换,原样输出
如果想确保只处理第一行且忽略其他行
可以结合地址范围限制,避免其他行参与匹配:
- sed '1s/apple/orange/' file.txt —— 默认只替换第一行第一个匹配项,其余行不处理(因为没指定行号)
- 更明确写法:sed -n '1s/apple/orange/p; 1!p' file.txt(但通常不需要这么复杂,单写
1s就已限定作用行)
注意默认行为和常见误区
sed 的地址(如 1)修饰的是整条命令,不是全局开关。所以 '1s/.../.../' 的意思是“仅在第1行上执行 s 命令”,其余行跳过该命令,不会被修改也不会触发替换。
- 不加行号(如
s/apple/orange/)会作用于每一行的第一个匹配 - 加
g(如1s/apple/orange/g)表示第一行内全部替换 - 数字后不加
g,就只动对应序号那一次匹配
想直接改原文件?加上 -i
例如把第一行第二个 “old” 替换为 “new”,并保存到原文件:
- sed -i '1s/old/new/2' file.txt
- 注意:-i 会直接覆盖原文件,建议先测试不加 -i 的效果

















