Mở rộng nẹp vỏ từ phải sang trái


9

Trong zsh (và các shell khác), nếu tôi bao gồm một đối số như (ví dụ):

{a,b,c}{d,e,f}

mở rộng cú đúp biến nó thành:

ad ae af bd be bf cd ce cf

Đối với mục đích của tôi, thứ tự đối số là quan trọng và tôi cần niềng răng để mở rộng từ phải sang trái thay vì từ trái sang phải. Đó là, tôi muốn bản mở rộng là:

ad bd cd ae be ce af bf cf

Có cách nào để kiểm soát thứ tự mà nhiều bộ niềng răng được mở rộng không? Tôi đang tìm kiếm thứ gì đó sẽ hoạt động trong mọi tình huống, không chỉ với những lập luận này.


Tôi cho rằng bạn không quan tâm đến các giải pháp phức tạp hơn liên quan đến các vòng lặp hoặc đầu ra được sắp xếp, phải không?
terdon

@terdon Nếu không có cách nào khác tôi cho là; Tôi đã hy vọng có một số mẹo để thay đổi thứ tự đánh giá mở rộng niềng răng, nhưng có lẽ không có. Tuy nhiên, những tranh luận đó chỉ là một ví dụ, vì vậy một cái gì đó chỉ hoạt động {a,b,c}{d,e,f}không hữu ích
Michael Mrozek

Vâng, tôi đoán là nhiều. Bạn có thể muốn làm rõ điều đó để tránh câu trả lời dựa trên thứ tự sắp xếp.
terdon

Câu trả lời:


8

Bạn có thể kết hợp mở rộng tham số với mở rộng cú đúp.

% foo=(d e f)
$ echo {a,b,c}${^foo}
ad bd cd ae be ce af bf cf

Nếu bạn không muốn xác định fooriêng (dường như có thể), bạn có thể sử dụng như sau:

$ echo {a,b,c}${^:-d e f}
ad bd cd ae be ce af bf cf

Nếu bạn có rcexpandparamtùy chọn được đặt, thì bạn không cần ^trong một ví dụ để kích hoạt hành vi này.

(Lưu ý: trong khi thử nghiệm, tôi cũng đã có shwordsplittùy chọn được đặt. Nếu bạn chưa cài đặt, hãy thử, ví dụ: echo {a,b,c}${^=:-d e f}Đạo đức của câu chuyện: hầu hết mọi thứ đều có thể zsh, nhưng bạn phải chắc chắn rằng mình đang sử dụng đúng kết hợp các tùy chọn và cú pháp.)


1
Bạn nên sử dụng print -- {a,b,c}${^=:-d e f}làm ví dụ chính, kể từ khi split+globtắt theo mặc định zsh.
cuonglm

4

Trong zshbạn có thể sử dụng -C số lượng đối số cột được chỉ định để printthích:

print $(print -C3 {a,b,c}{d,e,f})

... để có được ...

ad bd cd ae be ce af bf cf

... Không có sự $IFSphân tách như sau:

print -C3 {a,b,c}{d,e,f}

... bản in ...

ad bd cd
ae be ce
af bf cf

... nhưng bạn có thể làm điều đó trước khi xuống như ...

print -aC3 {a,b,c}{d,e,f}

ad ae af
bd be bf
cd ce cf

...hoặc là...

print $(print -aC2 {foo,bar}{bad,baz})

foobad foobaz barbad barbaz

Điều đó tạo ra cùng một đầu ra mà MIchael đang cố gắng tránh. Anh ta muốn 1.1 2.1 3.1 và bạn đang đưa ra 1.1 1.2 1.3 (nếu điều đó rõ ràng).
terdon

@terdon - điểm tốt.
mikeerv

Tôi đoán (mặc dù không nói rõ ràng) rằng Michael theo thứ tự cụ thể của việc ghép đôi. Cách tiếp cận của bạn chỉ hoạt động nếu các yếu tố có thể được sắp xếp theo thứ tự abc. Còn về việc nhận foobad foobaz barbad barbaztừ {foo, bar} {bad, baz} `thì sao?
terdon

@terdon - tốt, nếu đó là những gì anh ấy sau đó tại sao không nói như vậy? và dù sao đi nữa, các cột có thể được ghép nối theo bất kỳ cách nào nếu bạn làm toán.
mikeerv

1
@terdon - bạn điều hành dường như biến nó thành thói quen nói những gì bạn không muốn nói.
mikeerv

2

Bạn có thể đặt số ở cuối mỗi phần tử của tập thứ hai và sau đó sắp xếp vào ký tự cuối cùng:

echo -e "\n"{a,b,c}{d1,e2,f3} | sort -k 1.3 | cut -c 1-2 | tr '\n' ' '

Thậm chí tốt hơn là thêm số sau một số dấu phân cách (dấu cách), để cắt các trường, không phải ký tự:

echo -e "\n"{a,b,c}{"d 1","e 2","f 3"} | sort -k 2n | cut -f 1 -d ' ' -s | tr '\n' ' '

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.