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