Albo bardziej ogólnie, jak usunąć element z listy rozdzielanej dwukropkami w zmiennej środowiskowej Bash?
Wydawało mi się, że lata temu widziałem prosty sposób, aby to zrobić, wykorzystując bardziej zaawansowane formy rozwijania zmiennych Bash, ale jeśli tak, to straciłem z oczu. Szybkie wyszukiwanie w Google przyniosło zaskakująco mało trafnych wyników i żadnego, który nazwałbym „prostym” lub „eleganckim”. Na przykład dwie metody używające odpowiednio sed i 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)
Czy nie istnieje nic prostego? Czy jest coś podobnego do funkcji split () w Bash?
Aktualizacja:
Wygląda na to, że muszę przeprosić za moje celowo niejasne pytanie; Byłem mniej zainteresowany rozwiązaniem konkretnego przypadku użycia niż sprowokowaniem dobrej dyskusji. Na szczęście mam to!
Jest tu kilka bardzo sprytnych technik. W końcu dodałem do mojego zestawu narzędzi następujące trzy funkcje. Magia dzieje się w path_remove, która w dużej mierze opiera się na sprytnym wykorzystaniu awk
zmiennej RS przez Martina Yorka .
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/:$//'`; }
Jedynym prawdziwym okrucieństwem jest użycie sed
do usunięcia końcowej okrężnicy. Biorąc jednak pod uwagę, jak prosta jest reszta rozwiązania Martina, jestem całkiem skłonny z tym żyć!
Powiązane pytanie: Jak manipulować elementami $ PATH w skryptach powłoki?
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
ale musisz ją nazwaćfunc $VAR VAR pattern
(na podstawie @ martin-york i @ andrew-aylett)