使用 'sed' 仅替换第一个和最后一个匹配项

使用 'sed' 仅替换第一个和最后一个匹配项

我想用新字符串替换旧字符串。这是我使用的

sed -i "0,|$old|{s|$old|$new|g}" file

但它给了我错误:

sed: -e expression #1, char 3: unexpected `,'

如何改变它?

如何仅更改最后一次出现的事件?

例子

Apple / Banana / Apple / orange / Apple
                                    |
                                    |
                                   \-/
Apple / Banana / Apple / orange / Melon

答案1

除了替代(s)命令之外,你需要在替代分隔符前面加上反斜杠,即,要|在你的范围内用作正则表达式分隔符,它必须是0,\|$old|

所以

sed -i "0,\|$old|{s|$old|$new|g}" file

应该可以工作(尽管替代表达式周围的括号是不必要的,因为它是一个单一表达式)。

请注意,包含g(全局)标志将导致 sed 替换全部$old第一的匹配行:

$ echo -e "old and bold\nolder and bolder\noldest and boldest" | sed "0,\|old| s|old|new|g"
new and bnew
older and bolder
oldest and boldest

如果你只想替换第一个实例,请删除gie

$ echo -e "old and bold\nolder and bolder\noldest and boldest" | sed "0,\|old| s|old|new|"
new and bold
older and bolder
oldest and boldest

答案2

这应该对你有用:

sed -i "0,/${old}/s,${old},${new}," file

相关内容