Thoát dấu ngoặc kép trong bí danh zsh


12

Tiếp theo từ câu hỏi này về việc tước dòng mới ra khỏi văn bản, tôi muốn biến điều này thành bí danh zsh như sau:

alias striplines=' awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'

Tôi đã thử thoát các trích dẫn bên trong tập lệnh awk, nhưng tôi gặp lỗi này:

awk: (FILENAME=bspsrobustness FNR=1) fatal: division by zero attempted

(Tệp được gọi bspsrobustness)

Có cách nào để làm những gì tôi muốn không? Tôi cho rằng tôi có thể biến điều này thành một kịch bản awk chứ không phải là bí danh zsh, đó có phải là lựa chọn tốt nhất của tôi không?


Nhân tiện, điều này áp dụng cho tất cả các shell (kiểu Bourne, không phải csh).
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


9

Bạn có thể sử dụng hàm zsh thay vì bí danh. Không có trích dẫn để nhảy qua.

striplines() {
    awk '... awk body "with quotes" ...' "$@"
}

Và sau đó tôi sẽ gọi nó như thế nào : striplines filename?
Seamus

bạn có thể giải thích những gì "$@"đang làm?
Seamus

@Seamus, vâng, bạn gọi nó chính xác như thế. Các "$@"cú pháp gửi striplines đối số cho awk không bị xáo trộn - cần thiết nếu, chẳng hạn, bất kỳ tên tập tin của bạn chứa khoảng trắng: striplines "file 1" "file 2"sẽ gửi hai tên tập tin để awk.
glenn jackman

5

Để có ý tưởng về những gì đang xảy ra, hãy chạy

% alias striplines='print -lr awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'
% striplines
awk
 /^$/ {print "\n"; } /./ {printf( " %s ",zsh);}

Vì các $ký tự nằm trong dấu ngoặc kép (khi chúng được mở rộng sau khi bí danh được mở rộng), chúng được giải thích bởi shell. Để có được trích dẫn đúng, dễ dàng hơn để đặt toàn bộ định nghĩa bí danh trong các trích dẫn đơn. Những gì bên trong dấu ngoặc đơn là những gì sẽ được mở rộng khi bí danh được sử dụng. Bây giờ, đối số awkđược bao quanh trong dấu ngoặc kép, rõ ràng rằng bạn cần dấu gạch chéo ngược trước đó \"$.

alias striplines='print -lr awk " /^\$/ {print \"\n\"; } /./ {printf( \" %s \",\$0);}"'

Một thành ngữ hữu ích để trích dẫn một chuỗi trích dẫn đơn '\''là khá nhiều cách để đặt một trích dẫn đơn theo nghĩa đen trong một chuỗi trích dẫn đơn. Về mặt kỹ thuật, có một vị trí kề nhau của một chuỗi trích dẫn đơn, một dấu gạch chéo ngược 'và một chuỗi trích dẫn đơn khác. Chuỗi rỗng liền kề ''ở cuối có thể được gỡ bỏ.

alias striplines='print -lr awk '\'' /^$/ {print "\n"; } /./ {printf( " %s ",$0);}'\'

Sau lời giải thích dài này, một khuyến nghị: khi quá phức tạp đối với bí danh, hãy sử dụng hàm .

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.