Làm cách nào tôi có thể chặn không gian giữa các đối số được tạo trong quá trình mở rộng dấu ngoặc?


8

Tôi đã sử dụng lệnh sau để tạo danh sách URL mà tôi muốn kiểm tra:

echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

Thật không may, các URL được thêm vào urls.txtmỗi cái có một khoảng trắng trước chúng (ngoại trừ lần đầu tiên, tất nhiên). Tôi hiểu lý do tại sao điều đó xảy ra và tôi nhận ra rằng tôi có thể loại bỏ nó bằng cách tạo ra một sedbiểu thức, nhưng tôi muốn biết liệu có cách nào để ngăn chặn nó thay vào đó không. (Nó có vẻ ngớ ngẩn và ấu dâm, nhưng nó không khác gì sở thích nên nhiều người cảm thấy không "lạm dụng mèo" .)

Tôi đã thử trích dẫn kép để ngăn chặn việc chia tách từ , nhưng điều đó cũng ngăn chặn việc mở rộng dấu ngoặc, vì vậy đó là điều không nên.

Tôi đã thử thay đổi IFS thành một chuỗi trống, nhưng nó cũng không hoạt động:

IFS='' echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

Cũng không thay đổi nó thành một dòng mới:

IFS='\n' echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

Bạn đang sử dụng bash hoặc zsh?
Braiam

tại thời điểm tôi đang sử dụng bash (tôi đang làm việc) nhưng trên máy tính xách tay của riêng tôi, tôi sử dụng zsh. Tôi đã mong đợi mở rộng cú đúp để hoạt động giống hệt nhau trong cả hai, nhưng có lẽ đó không phải là trường hợp.
iconoclast

Trong trường hợp đó, câu trả lời của Gnouc sẽ tương thích nhất với các shell khác nhau.
Braiam

Câu trả lời của Richard sẽ không tương thích như nhau? (Nó cũng có ưu điểm là đơn giản hơn, do đó tôi không phải dừng lại và suy nghĩ về các bit khó hiểu vào lần tới khi tôi muốn sử dụng nó.) Mặt khác, câu trả lời của Gnouc cũng rất tuyệt vời. Và tôi nghĩ rằng tôi đã học được nhiều nhất từ ​​câu trả lời của glenn jackson. Câu trả lời của Leiaz có vẻ đơn giản và thanh lịch nhất, nhưng tất nhiên chỉ là zsh.
iconoclast

Câu trả lời:


8

Bạn có thể lưu trữ mở rộng dấu ngoặc trong một mảng, sau đó xuất nó theo cách bạn chọn:

urls=( localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} )

Sau đó

printf "%s\n" "${urls[@]}"

hoặc là

(IFS=$'\n'; echo "${urls[*]}")

Ví dụ echo có vẻ kỳ lạ bởi vì:

  1. nó chạy trong một lớp con (dấu ngoặc đơn) vì vậy tôi không thay đổi giá trị IFS hiện tại của mình.
  2. IFS cần được xác định trong một lệnh riêng biệt:
    • Điều này không hoạt động: IFS=$'\n' echo "${urls[*]}"bởi vì biến được mở rộng trước khi biến env mới có hiệu lực
    • IFS cần được đặt trước khi bạn bắt đầu mở rộng các biến.

Ngoài ra, lưu ý sự khác biệt tinh tế trong chỉ số mảng hội nghị được sử dụng:

  • [@] trong ví dụ printf để mở rộng mảng thành các từ riêng lẻ
  • [*] trong ví dụ echo để mở rộng mảng thành một từ duy nhất, với các phần tử được phân tách bằng char đầu tiên của IFS

Đó là một cuộc gọi khó khăn, nhưng tôi chọn câu trả lời này bởi vì (1) dường như (AFAIK) là gần nhất với mục tiêu đã nêu là triệt tiêu hơn là chỉ xóa các khoảng trắng, và (2) tôi đã học được nhiều nhất từ ​​nó (a mục tiêu của câu hỏi của tôi)
iconoclast

16

Sử dụng printfnội dung:

$ printf %s\\n localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}
localhost:8080/reports/promos/130
localhost:8080/reports/promos/130.pdf
localhost:8080/reports/promos/130.xls
localhost:8080/reports/promos/130.xlsx
localhost:8080/reports/promos/130.csv
localhost:8080/reports/promos/130.preload
localhost:8080/reports/promos/130-unburdened
localhost:8080/reports/promos/130-unburdened.pdf
localhost:8080/reports/promos/130-unburdened.xls
localhost:8080/reports/promos/130-unburdened.xlsx
localhost:8080/reports/promos/130-unburdened.csv
localhost:8080/reports/promos/130-unburdened.preload
....

6

Điều này được gắn thẻ zsh, vì vậy tôi đề xuất nội dung zsh print:

print -l localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}

-l in các đối số trên các dòng riêng biệt.


+1 Cảm ơn - thật tốt khi biết! Tôi sẽ sử dụng nó khi tôi trên zsh. Tôi đã gắn thẻ nó đơn giản vì tôi sử dụng cả hai và cả hai đều hỗ trợ mở rộng nẹp. (Tôi không biết có ai khác làm không, nhưng tôi thấy ksh rất khó hiểu, vì vậy tôi tránh xa.)
iconoclast

3

Vấn đề là việc mở rộng cú đúp đang thêm không gian và echo đang thêm dòng mới. Vì vậy, sử dụng nguyên tắc trách nhiệm duy nhất, xử lý các dòng mới riêng biệt.

echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} | tr " " "\n"

Tôi nghĩ rằng đây là cách tiếp cận đơn giản và thiết thực nhất
iconoclast

Không, mở rộng cú đúp không thêm không gian, nó tạo ra một số đối số echo. Đó là echoin các đối số của nó được phân tách bằng dấu cách.
Stéphane Chazelas

Tôi đoán vấn đề xảy ra do echotách các đối số theo khoảng trắng và dòng mới được chèn thêm trước mỗi khoảng trắng thay vì thay thế khoảng trắng (sẽ hợp lý hơn). Từ bộ nhớ, xargscó một vấn đề đã biết rất giống với vấn đề này (đặc biệt là với -0tùy chọn)
cú pháp
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.