Cách sử dụng bash dựng sẵn để thay thế đầu ra của một lớp con hoặc hàm


9

Tôi đang cố gắng sử dụng chuỗi con bash tích hợp để thay thế đầu ra của một chuỗi con hoặc một hàm bash khác.

Các lệnh sau hoạt động khá tốt trong zsh; nhưng kết quả là một bad substitutionlỗi trong bash:

${${PWD##*/}//trunk/latest}

hoặc là

${$(basename $PWD)//trunk/latest}

đầu ra phải là thư mục cuối cùng của $PWD, được thay thế bằng latestkhi thư mục hiện tại của tôi làtrunk

vì vậy /home/user/trunknên trở thànhlatest

Có một bash tương đương cho phép chuỗi phiên bản chuỗi mà không cần dựa vào các biến hoặc đường ống? Hoặc bash dựng sẵn chỉ cho phép đầu vào là một chuỗi hoặc một biến đơn giản?

Câu trả lời:


9

Không, việc lồng các toán tử thay thế là duy nhất zsh.

Lưu ý rằng với zshthích với (t)csh, bạn cũng có thể làm ${PWD:t:s/trunk/latest/}.

Mặc dù bashcũng hỗ trợ các bộ sửa đổi lịch sử csh để mở rộng lịch sử, nhưng nó không hỗ trợ chúng cho các mở rộng tham số của nó.

Ở đây với bash, sử dụng một biến tạm thời:

var=${PWD##*/} var=${var//trunk/latest}

3

Hãy thử điều này với bash:

[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"

hoặc với một lệnh:

[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]

Kết quả là trong ${BASH_REMATCH[1]}


0

bạn có muốn...?

PWD=latest

Tôi không thấy một phương pháp theo yêu cầu của bạn. Nếu bạn muốn thay thế tất cả $PWDw / mới nhất - mặc dù cách tốt nhất để làm điều đó là cdmới nhất.

[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -

... sẽ đưa bạn đến bản mới nhất và in tên đường dẫn đến thiết bị xuất chuẩn. Bạn có thể quay lại ngay nơi bạn đến bằng cách làm cd -lại. Bạn có thể làm tương tự w / $CDPATH:

mkdir -p /tmp/{1..5}  ; \
CDPATH=/tmp cd 3; cd -; \
echo "${CDPATH:-empty or unset::}" "$OLDPWD"

/tmp/3
/home/mikeserv
empty or unset:: /tmp/3

Vấn đề không nằm ở chính sự thay thế, nó có thể đạt được sedtrong vài bước. Nhưng tôi không hiểu tại sao bash từ chối thực hiện subshell, sau đó thay thế nội dung của nó như bất kỳ chuỗi nào khác
yabuki_joe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.