또는보다 일반적으로 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)
간단한 것이 없습니까? Bash에서 split () 함수와 유사한 것이 있습니까?
업데이트 :
의도적으로 모호한 질문에 대해 사과해야 할 것 같습니다. 좋은 토론을 유도하는 것보다 특정 사용 사례를 해결하는 데 관심이 적었습니다. 다행스럽게도 알았습니다!
여기에는 매우 영리한 기술이 있습니다. 결국 다음 세 가지 기능을 도구 상자에 추가했습니다. 마법은 주로 Martin York의 awk
RS 변수 의 영리한 사용에 기반한 path_remove에서 발생 합니다.
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
은 후행 결장을 제거하기 위해 사용하는 것입니다 . 그러나 Martin의 나머지 솔루션이 얼마나 간단한 지 고려할 때 나는 기꺼이 함께 살기를 원합니다!
관련 질문 : 쉘 스크립트에서 $ 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 기반) 다음과 같이 호출해야합니다.