обновить переменную PATH в .bashrc, используя sed

Я пытаюсь постоянно обновлять свою переменную PATH, помещая ее в мой .bashrc-файл. Однако я не хочу просто добавлять его в файл, но вместо замены текущего PATH = …….. с переменной PATH, которую я имею для сеанса. Вот что я до сих пор:

sed 's/^PATH=.*/${PATH=$PATH}/' .bashrc > .bashrc 

Это hodpodge команд, которые я видел в Интернете, и когда я запускаю это, строка PATH .bashrc перезаписывается ничем. Я был бы признателен за решение, использующее sed, потому что я хочу добавить к знанию sed, которое я получил за последний час, вместо того, чтобы уклоняться от моих попыток awk или чего-то еще.

One Solution collect form web for “обновить переменную PATH в .bashrc, используя sed”

Первое: не пишите в файл, который вы читаете, вы, вероятно, закончите стирать его. Вместо этого используйте функцию inplace-edit ( -i ).

Далее, внутри жестких кавычек ( ' ), замена переменных не работает, поэтому вам нужно сделать что-то еще, чтобы получить расширенный $PATH .

Наконец, $PATH скорее всего, будет содержать / символы, которые разбивают синтаксис подстановки для sed , поэтому вам нужно будет использовать другой разделитель.

Предполагая, что ваши пути никогда не содержат ; s, попробуйте (после резервного копирования вашего текущего файла, конечно):

 sed -i 's;^PATH=.*;PATH='"$PATH"';' .bashrc 

Сопоставимая часть подстановки означает: соответствует строке, которая начинается с ( ^ ) строки PATH= и сопровождается любым символом ( . ) Любое количество раз ( * ). Т.е. он будет соответствовать строкам, начинающимся с PATH= полностью, но не с линиями, у которых PATH= где-то посередине. .* Важно, потому что вы хотите заменить всю строку (попробуйте без нее посмотреть, что произойдет).

Цитирование, чтобы получить $PATH замененное внутри замены, необходимо учитывать для случаев, когда $PATH будет содержать пробельные символы.

Демо-версия:

 $ foo=bar $ echo hello | sed -e 's/hello/$foo/' $foo 

Ко. вары не заменяются внутри жестких кавычек. Таким образом, вы получаете буквальный $foo . Теперь пусть оболочка расширяет его, выведя его из жестких котировок:

 $ foo=bar $ echo hello | sed -e 's/hello/'$foo'/' bar 

ОК! Но это небезопасно:

 $ foo="bar baz" $ echo hello | sed -e 's/hello/'$foo'/' sed: -e expression #1, char 11: unterminated `s' command 

sed получил два аргумента после -e выше: s/hello/bar и baz/ , отдельно. Нехорошо. Чтобы исправить это, вам нужно немного больше цитат:

 $ foo="bar baz" $ echo hello | sed -e 's/hello/'"$foo"'/' bar baz 

Включение переменных среды внутри " кавычек» – это то, что вы должны делать почти всегда, когда передаете его как аргумент чему-то другому, иначе (если бы $IFS не был изменен), он будет разделен на пробелы.

  • Убедитесь, что / etc / export содержит правило, используя bash
  • Как найти значение из выражения
  • Удалить столбец из CSV
  • Вставка текста в начале файла с помощью sed через терминал в Linux
  • Как записывать данные по одному из файлов tmp в конечный выходной файл, используя для цикла?
  • Как извлечь номер из строки
  • Как сравнить столбцы одной строки в одном файле?
  • Как удалить строки под подзаголовком в файле с помощью команд linux
  • Частота слов в тексте на неанглийском языке: как я могу объединить единичные и множественные формы и т. Д.?
  • Удаление всех комментариев C с помощью sed
  • sed и удалить строку между двумя шаблонами
  • Linux и Unix - лучшая ОС в мире.