Або загалом, як я можу видалити елемент зі списку, розділеного двокрапкою, у змінній середовища Bash?
Я думав, що бачив простий спосіб зробити це років тому, використовуючи вдосконалені форми розширення Bash змінної, але якщо так, я втратив це. Швидкий пошук Google виявив напрочуд мало релевантних результатів, і жодного, який я б назвав "простим" або "елегантним". Наприклад, два методи відповідно sed і awk:
PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')
PATH=!(awk -F: '{for(i=1;i<=NF;i++){if(!($i in a)){a[$i];printf s$i;s=":"}}}'<<<$PATH)
Немає нічого прямолінійного? Чи є щось подібне до функції split () у Bash?
Оновлення:
Схоже, мені потрібно вибачитися за моє навмисне розпливчасте запитання; Мені було менш цікаво вирішити конкретний випадок, ніж спровокувати гарну дискусію. На щастя, я це отримав!
Тут є кілька дуже розумних прийомів. Зрештою, я додав наступні три функції до своєї панелі інструментів. Магія відбувається в path_remove, який багато в чому базується на розумному використанні awk
змінної RS з боку Martin Martin .
path_append () { path_remove $1; export PATH="$PATH:$1"; }
path_prepend () { path_remove $1; export PATH="$1:$PATH"; }
path_remove () { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
Єдиним справжнім суглобом є використання sed
для видалення слідної кишки. Зважаючи на те, наскільки прямолінійне рішення Мартіна, я цілком готовий з цим жити!
Питання, пов'язані з цим: Як я маніпулюю $ PATH елементами в скриптах оболонки?
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
але ви повинні називати це якfunc $VAR VAR pattern
(на основі @ martin-york та @ andrew-aylett)