замените только первое и единственное последнее соответствие с помощью '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
задан 12 January 2015 в 13:40

2 ответа

За исключением команды (s) замены, необходимо снабдить альтернативный разделитель предисловием с обратной косой чертой т.е. использовать | в качестве regex разделителя в диапазоне, которым это должно быть 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
2
ответ дан 10 November 2019 в 10:58

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

sed -i "0,/${old}/s,${old},${new}," file
0
ответ дан 10 November 2019 в 10:58

Другие вопросы по тегам:

Похожие вопросы: