sed全局标志/g的作用及无/g仍全替换的Mac环境问题
关于Mac上sed替换行为的疑问解答
为什么不加/g也会替换所有匹配行?
你搞混了sed中/g标志的作用——它不是控制是否遍历整个文件的行,而是控制单一行内是否替换所有匹配项。
sed的默认行为是逐行处理文件里的每一行,对每一行执行替换命令:
- 不带
/g:每一行里只替换第一个匹配的内容 - 带
/g:每一行里替换所有匹配的内容
你的场景中,每一行只有一个"today is over",所以不管加不加/g,每一行都会完成替换,看起来就像是整个文件的匹配行都被处理了。Mac用的是BSD sed,和Linux的GNU sed在部分语法上有差异,但这个核心逻辑是一致的。
如何仅替换整个文件中的第一个匹配实例?
分两种场景处理:
只处理文件第一行里的第一个匹配项
用地址定位指定只处理第一行,默认行为就是该行只替换第一个匹配:sed '1 s/today is over/tomorrow will begin/' your_file.txt只处理整个文件中第一个出现匹配内容的行
BSD sed可以用范围匹配0,/pattern/来限定只处理到第一个匹配行,示例:# 替换第一个匹配行里的第一个实例 sed '0,/today is over/s//tomorrow will begin/' your_file.txt # 如果要替换第一个匹配行里的所有实例,加/g sed '0,/today is over/s//tomorrow will begin/g' your_file.txt
内容的提问来源于stack exchange,提问作者Matt Croak
相关产品推荐
相关产品推荐

