Cách xuất chuỗi được phân tách bằng dấu phẩy bằng cách sử dụng mở rộng bash brace


17

tôi muốn

$ echo a{b,c,d}

để tạo ra một danh sách được phân tách bằng dấu phẩy như

ab,ac,ad

thay vì đầu ra thông thường

ab ac ad

Cách dễ nhất để làm điều đó trên dòng lệnh là gì?

Câu trả lời:


9

Giả sử rằng các thành phần không chứa khoảng trắng, bạn có thể dịch khoảng trắng sang dấu phẩy:

echo a{b,c,d} | tr ' ' ,

sản xuất:

ab,ac,ad

Bạn cũng có thể sử dụng phạm vi với các ký tự:

echo a{b..d} | tr ' ' ,

Điều này đặc biệt hữu ích nếu bạn muốn một phạm vi lớn hơn.


13

Có vẻ như bash không sử dụng $ IFS để tham gia các từ được tạo. Một kỹ thuật khác là lưu trữ các từ đã tạo trong một mảng và sau đó $ IFS sẽ được phát:

Tôi sẽ sử dụng một subshell vì vậy tôi không thay đổi IFS của shell này: chọn một trong các

( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )

Điều đó phát ra chuỗi phân tách dấu phẩy thành thiết bị xuất chuẩn. Nếu bạn muốn chụp nó:

joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )

không tham gia các từ được tạo ra ở tất cả. Đó là toàn bộ vấn đề, nó mở rộng thành các từ riêng biệt.
Stéphane Chazelas

5

Tôi chắc chắn có nhiều cách để thực hiện điều này. Đây là một phương pháp:

echo a{b,c,d} | sed 's/ /,/g'

2

Mở rộng các phần tử như bạn đã hiển thị và sau đó lặp lại chúng, thêm dấu phẩy cho tất cả trừ lần lặp đầu tiên:

for i in a{b,c,d}; do
  u="${u:+$u, }$i"
done
echo "$u"

Kết quả:

ab, ac, ad

Xem thay thế tham số bash .


1

Đây là một giải pháp chỉ bash.

(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad

Phần trước dấu chấm phẩy gán ab ac adcho biến INvà phần thứ hai sử dụng tìm kiếm và thay thế để thay đổi tất cả các dấu cách thành dấu phẩy. Có //nghĩa là tất cả các trận đấu, không chỉ đầu tiên.

Làm tất cả trong một khung con (dấu ngoặc đơn kèm theo) để không làm ô nhiễm không gian tên của bạn.


1

Điều đáng chú ý là trong nhiều bối cảnh, dấu phẩy có thể được chấp nhận trong danh sách đó. NẾU dấu phẩy có thể chấp nhận được, cách dễ nhất để xử lý thay thế là printf:

some-command "$(printf %s, a{b,c,d} )"

(Trường hợp some-commandmột lệnh chạy trên danh sách được phân tách bằng dấu phẩy và không quan tâm đến dấu phẩy.)

Trên thực tế, ngay cả khi bạn không phải có dấu phẩy bạn có thể sử dụng printf; bạn chỉ cần xác định số lượng đối số bạn mong đợi, điều này làm cho nó trở nên vụng về hơn cho các danh sách rất dài:

some-command "$(printf %s,%s,%s a{b,c,d} )"
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.