หนีคำพูดในนามแฝง zsh


12

จากคำถามนี้เกี่ยวกับการลอกบรรทัดใหม่ออกจากข้อความฉันต้องการเปลี่ยนให้เป็นนามแฝง zsh ดังนี้:

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

ฉันได้พยายามหลีกเลี่ยงคำพูดในสคริปต์ awk แต่ฉันได้รับข้อผิดพลาดนี้:

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

(ไฟล์นี้เรียกว่าbspsrobustness)

มีวิธีทำสิ่งที่ฉันต้องการหรือไม่? ฉันคิดว่าฉันสามารถเปลี่ยนให้เป็นสคริปต์ awk แทนที่จะเป็น zsh alias นั่นเป็นตัวเลือกที่ดีที่สุดของฉันหรือไม่


อย่างไรก็ตามวิธีนี้ใช้กับเชลล์ทั้งหมด (Bourne-style ไม่ใช่ csh)
Gilles 'ดังนั้นหยุดความชั่วร้าย'

คำตอบ:


9

คุณสามารถใช้ฟังก์ชัน zsh แทน alias ได้ ไม่มีการยกห่วงเพื่อกระโดดข้าม

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

แล้วฉันจะเรียกมันว่าstriplines filenameอย่างไร:
เชมัส

คุณช่วยอธิบายสิ่งที่"$@"กำลังทำอยู่ได้ไหม?
เชมัส

@Seamus ใช่คุณจะเรียกมันว่าอย่างนั้น "$@"ไวยากรณ์ส่งข้อโต้แย้ง striplines เพื่อ awk สงบ - จำเป็นถ้าพูดใด ๆ ของชื่อไฟล์ของคุณมีช่องว่าง: striplines "file 1" "file 2"จะส่งสองชื่อไฟล์เพื่อ awk
เกล็นแจ็คแมน

5

หากต้องการทราบว่าเกิดอะไรขึ้นให้เรียกใช้

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

เนื่องจาก$อักขระอยู่ในเครื่องหมายอัญประกาศคู่ (เมื่ออักขระถูกขยายหลังจากนามแฝงถูกขยาย) อักขระเหล่านั้นจะถูกตีความโดยเชลล์ เพื่อให้ได้ข้อความที่ถูกต้องมันง่ายกว่าที่จะใส่คำจำกัดความของนามแฝงทั้งหมดในเครื่องหมายคำพูดเดี่ยว สิ่งที่อยู่ในเครื่องหมายคำพูดเดี่ยวคือสิ่งที่จะขยายเมื่อใช้นามแฝง ตอนนี้ว่าอาร์กิวเมนต์ของถูกล้อมรอบในราคาคู่ก็เป็นที่ชัดเจนว่าคุณจะต้องทับขวาก่อนawk\"$

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

สำนวนที่มีประโยชน์ในการอ้างคำพูดเดี่ยวสตริงที่ยกมาเป็นวิธีที่'\''ค่อนข้างมากที่จะใส่คำพูดเดียวที่แท้จริงในสตริงที่ยกมาเดี่ยว ในทางเทคนิคมีการวางเคียงกันของสตริงที่ยกมาเดี่ยว, เครื่องหมายแบ็กสแลชที่ยกมา'และอีกสตริงที่ยกมาเดี่ยว สตริงว่าง juxtaposed ''ที่ส่วนท้ายสามารถลบออกได้

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

หลังจากคำอธิบายยาวนี้คำแนะนำ: เมื่อมันซับซ้อนเกินไปสำหรับนามแฝงใช้ฟังก์ชั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.