Заменить только первый и только последний матч, используя "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

2 ответа

Решение

За исключением замены (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

Если вы хотите заменить только самый первый экземпляр, удалите g т.е.

$ 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

Это должно работать для вас:

sed -i "0,/${old}/s,${old},${new}," file
Другие вопросы по тегам