การขยายตัวของค้ำยันจากขวาไปซ้าย


9

ใน zsh (และเชลล์อื่น ๆ ) ถ้าฉันมีอาร์กิวเมนต์เช่น (ตัวอย่าง):

{a,b,c}{d,e,f}

การขยายรั้งเปลี่ยนเป็น:

ad ae af bd be bf cd ce cf

สำหรับวัตถุประสงค์ของฉันลำดับการโต้แย้งมีความสำคัญและฉันต้องการเครื่องมือจัดฟันเพื่อขยายจากขวาไปซ้ายแทนซ้ายไปขวา นั่นคือฉันต้องการขยายตัวเป็น:

ad bd cd ae be ce af bf cf

มีวิธีควบคุมลำดับของการจัดฟันหลายชุดหรือไม่? ฉันกำลังมองหาบางสิ่งบางอย่างที่จะทำงานในสถานการณ์ใด ๆ ไม่เพียง แต่มีข้อโต้แย้งเหล่านี้


ฉันคิดว่าคุณไม่สนใจโซลูชันที่ซับซ้อนยิ่งขึ้นที่เกี่ยวข้องกับลูปหรือเอาต์พุตเรียงลำดับใช่ไหม?
terdon

@terdon หากไม่มีวิธีอื่นที่ฉันคิดว่า; ฉันหวังว่าจะมีเคล็ดลับในการเปลี่ยนลำดับของการประเมินผลการขยายรั้ง แต่อาจไม่มี แม้ว่าข้อโต้แย้งเหล่านี้เป็นเพียงตัวอย่างเท่านั้นดังนั้นสิ่งที่ใช้ได้ผล{a,b,c}{d,e,f}ไม่ดีเท่าที่ควร
Michael Mrozek

ใช่ฉันเดาได้มาก คุณอาจต้องการทำให้ชัดเจนแม้ว่าจะหลีกเลี่ยงคำตอบตามลำดับการเรียง
terdon

คำตอบ:


8

คุณสามารถรวมการขยายพารามิเตอร์กับการขยายรั้ง

% foo=(d e f)
$ echo {a,b,c}${^foo}
ad bd cd ae be ce af bf cf

หากคุณไม่ต้องการกำหนดfooแยกต่างหาก (น่าจะเป็น) คุณสามารถใช้สิ่งต่อไปนี้:

$ echo {a,b,c}${^:-d e f}
ad bd cd ae be ce af bf cf

หากคุณมีrcexpandparamชุดตัวเลือกคุณไม่จำเป็นต้องใช้^ทั้งในตัวอย่างเพื่อเปิดใช้งานลักษณะการทำงานนี้

(หมายเหตุ: ในระหว่างการทดสอบฉันมีshwordsplitชุดตัวเลือกด้วยเช่นกันถ้าคุณยังไม่ได้ตั้งค่าลองใช้ตัวอย่างecho {a,b,c}${^=:-d e f}ของคุณธรรมของเรื่องราว: เกือบทุกอย่างเป็นไปได้zshแต่คุณต้องแน่ใจว่าคุณใช้ถูกต้อง การรวมกันของตัวเลือกและไวยากรณ์)


1
คุณควรใช้print -- {a,b,c}${^=:-d e f}เป็นตัวอย่างหลักตั้งแต่เมื่อถูกปิดโดยเริ่มต้นในsplit+glob zsh
cuonglm

4

ในzshคุณสามารถใช้-C จำนวนคอลัมน์ที่ระบุเพื่อโต้แย้งprintชอบ:

print $(print -C3 {a,b,c}{d,e,f})

... เพื่อรับ ...

ad bd cd ae be ce af bf cf

... โดยไม่ต้อง$IFSแยกสิ่งต่อไปนี้:

print -C3 {a,b,c}{d,e,f}

... พิมพ์ ...

ad bd cd
ae be ce
af bf cf

... แต่คุณสามารถทำสิ่งนั้นข้ามมาก่อนเช่น ...

print -aC3 {a,b,c}{d,e,f}

ad ae af
bd be bf
cd ce cf

...หรือ...

print $(print -aC2 {foo,bar}{bad,baz})

foobad foobaz barbad barbaz

ที่สร้างผลลัพธ์เดียวกันกับที่ MIchael พยายามหลีกเลี่ยง เขาต้องการ 1.1 2.1 3.1 และคุณให้ 1.1 1.2 1.3 (ถ้าชัดเจน)
terdon

@terdon - จุดดี
mikeserv

ฉันคาดเดา (แม้ว่าจะไม่ได้ระบุไว้อย่างชัดเจน) ว่าไมเคิลอยู่หลังการจับคู่ที่เฉพาะเจาะจง วิธีการของคุณจะทำงานได้ก็ต่อเมื่อองค์ประกอบสามารถเรียงตามตัวอักษร แล้วจะได้อะไรfoobad foobaz barbad barbazจาก {foo, bar} {bad, baz} `?
terdon

@terdon - ถ้าเป็นอย่างนั้นทำไมเขาถึงไม่พูดอย่างนั้นล่ะ? และอย่างไรก็ตามคอลัมน์สามารถจับคู่กับวิธีใดก็ได้ถ้าคุณใช้คณิตศาสตร์
mikeserv

1
@terdon - ผู้ดำเนินรายการดูเหมือนจะทำให้คุณมีนิสัยชอบพูดสิ่งที่คุณไม่ได้ตั้งใจ
mikeserv

2

คุณสามารถใส่ตัวเลขที่ส่วนท้ายของแต่ละองค์ประกอบของชุดที่สองแล้วเรียงลำดับตามอักขระตัวสุดท้าย:

echo -e "\n"{a,b,c}{d1,e2,f3} | sort -k 1.3 | cut -c 1-2 | tr '\n' ' '

ยิ่งไปกว่านั้นคือการเพิ่มตัวเลขหลังตัวคั่น (ช่องว่าง) เพื่อตัดฟิลด์ไม่ใช่อักขระ:

echo -e "\n"{a,b,c}{"d 1","e 2","f 3"} | sort -k 2n | cut -f 1 -d ' ' -s | tr '\n' ' '

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