2013-08-02 41 views
5

cụ thể tôi biết làm thế nào để dễ dàng tạo ra một danh sách theo cách này:Làm thế nào để tạo ra một danh sách với sự mở rộng cú đúp để

echo {a,b,c,d}_{0..3}

mà sẽ cung cấp:

a_0 a_1 a_2 a_3 b_0 b_1 b_2 b_3 c_0 c_1 c_2 c_3 d_0 d_1 d_2 d_3

Nhưng làm thế nào để tạo ra cùng một danh sách, nhưng với cú đúp thứ hai được chi tiêu với một ưu tiên higer, để có được điều này? :

a_0 b_0 c_0 d_0 a_1 b_1 c_1 d_1 a_2 b_2 c_2 d_2 a_3 b_3 c_3 d_3

Bất kỳ lừa như sắp xếp từ cuối cùng, hoặc từ nhân vật n là OK, miễn là nó phù hợp trên cùng một dòng. Tôi cũng đang sử dụng zsh, nhưng một cái gì đó làm việc với bash là tốt.

Trả lời

6

Đó là không được thực hiện, nhưng bạn có thể sử dụng một hack xấu xí như

echo $(eval echo \{a,b,c,d\}_{0..3}) 

để đạt được nó bằng cách tích cực đầu tiên đánh giá cú đúp thứ hai và trong bước thứ hai cú đúp đầu tiên.

Hãy ghi nhớ rằng mặc dù bước trung gian phải đủ nhỏ để có thể vẫn được phân tách bằng vỏ ;-)

+1

+1 cho câu cuối cùng. –

1

Tôi muốn thêm một cách tiếp cận giải quyết vấn đề này với một hack khác nhau. Nó dựa trên biến ngôn luận, đánh giá nó rồi, sau đó chuyển kết quả lại một lần nữa:

eval echo $(echo '{a,b,c,d}_{0..3}' | rev | tr '{}' '}{') | rev 

kết quả trong

a_0 b_0 c_0 d_0 a_1 b_1 c_1 d_1 a_2 b_2 c_2 d_2 a_3 b_3 c_3 d_3 

Nhưng tôi không chắc là tôi thực sự có thể đề nghị để làm điều này ;-)

1

Không đúng bash-in-house, nhưng

printf "%s\n" {a,b,c,d}_{0..3} | sort -t_ -k2,2n 
2

tôi cũng tìm thấy một giải pháp khác (zsh chỉ), needlessl y phức tạp và do đó thú vị:

print {a,b,c,d}_${^=${$+0 1 2 3}}

Làm gì zsh ở đây? Nó bắt đầu với cú đúp lồng ngoái và:

  • kiểm tra nếu $$ tồn tại, vì vậy sử dụng "0 1 2 3" (operator +)
  • chia nó thành một mảng (operator =)
  • áp dụng phân phối từng yếu tố để các chuỗi, như mở rộng cú đúp (nhà điều hành ^)
  • cuối cùng áp dụng mở rộng của nẹp đầu tiên (vì sự ưu tiên thấp hơn của việc mở rộng cú đúp so với việc mở rộng tham số)

Lưu ý rằng tôi phải mở rộng {0..3} của tôi tự, vì không có cờ/toán tử nào có thể kích hoạt mở rộng sơ bộ loại AFAIK này (ngoại trừ eval như đã giải thích ở trên).

Các vấn đề liên quan