Hay nói chung hơn, làm cách nào để xóa một mục khỏi danh sách được phân tách bằng dấu hai chấm trong biến môi trường Bash?
Tôi nghĩ rằng tôi đã thấy một cách đơn giản để làm điều này nhiều năm trước, sử dụng các dạng mở rộng biến Bash nâng cao hơn, nhưng nếu vậy tôi đã mất dấu. Một tìm kiếm nhanh trên Google đã cho ra một vài kết quả có liên quan đáng ngạc nhiên và không có kết quả nào mà tôi gọi là "đơn giản" hay "thanh lịch". Ví dụ: hai phương pháp sử dụng sed và awk, tương ứng:
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)
Không có gì đơn giản tồn tại? Có điều gì tương tự với hàm split () trong Bash không?
Cập nhật:
Có vẻ như tôi cần phải xin lỗi vì câu hỏi mơ hồ có chủ ý của mình; Tôi ít quan tâm đến việc giải quyết một trường hợp sử dụng cụ thể hơn là khuyến khích thảo luận tốt. May mắn thay, tôi đã hiểu nó!
Có một số kỹ thuật rất thông minh ở đây. Cuối cùng, tôi đã thêm ba chức năng sau vào hộp công cụ của mình. Điều kỳ diệu xảy ra trong path_remove, phần lớn dựa trên cách sử dụng thông minh awk
biến RS của Martin York .
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/:$//'`; }
Điểm mấu chốt thực sự duy nhất trong đó là việc sử dụng sed
để loại bỏ dấu hai chấm ở cuối. Tuy nhiên, xét đến mức độ đơn giản của giải pháp còn lại của Martin, tôi khá sẵn lòng sống với nó!
Câu hỏi liên quan: Làm cách nào để thao tác các phần tử $ PATH trong các tập lệnh shell?
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
nhưng bạn phải gọi nó nhưfunc $VAR VAR pattern
(dựa trên @ martin-york và @ andrew-Aylett)