Bash คำสั่งเพื่อคัดลอกก่อนเคอร์เซอร์และวางหลังจาก?


24

ฉันไม่แน่ใจว่าจะใช้คำนี้ได้อย่างไร แต่บ่อยครั้งที่ฉันพบว่าฉันพิมพ์คำสั่งเช่นนี้:

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

ฉันมักจะพิมพ์เส้นทางสองครั้ง (ด้วยแท็บเสร็จ) หรือฉันจะคัดลอกและวางเส้นทางด้วยเคอร์เซอร์ มี bashfoo ที่ทำให้พิมพ์ง่ายขึ้นไหม


2
ฉันคิดว่าคุณหมายถึงbash-fu:)
แมว

คำตอบ:


43

มีกลอุบายจำนวนมาก (มีซ้ำที่ฉันคิดว่าพบ) แต่สำหรับสิ่งนี้ฉันมักจะทำ

cp /etc/prog/dir1/myconfig.yml{,.bak}

ซึ่งได้รับการขยายไปยังคำสั่งของคุณ

นี้เรียกว่าการขยายตัวรั้ง ในรูปแบบที่ใช้ที่นี่{}นิพจน์ระบุจำนวนของสตริงที่คั่นด้วยเครื่องหมายจุลภาค เหล่านี้ "ขยาย" ทั้ง/etc/prog/dir1/myconfig.yml{,.bak}การแสดงออกเปลี่ยน{}เป็นส่วนหนึ่งกับแต่ละสายในการเปิด: สตริงที่ว่างเปล่าให้/etc/prog/dir1/myconfig.ymlแล้วให้.bak /etc/prog/dir1/myconfig.yml.bakผลที่ได้คือ

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

นิพจน์เหล่านี้สามารถซ้อนกันได้:

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

ผลิต

ab ac ade adf adg

มีตัวแปรที่ใช้ตัวเลขเพื่อสร้างลำดับ:

echo {1..10}

ผลิต

1 2 3 4 5 6 7 8 9 10

และคุณยังสามารถระบุขั้นตอน:

echo {0..10..5}

ผลิต

0 5 10

แช่งนั่นหวาน ฉันคิดว่าฉันไม่ใช่คนแรกที่ถามแค่คำถามยาก ๆ
user1028270

เครื่องหมายจุลภาคทำอะไรที่นั่น?
user1028270

5
ดูBrace Expansionในคู่มือ: มันแยกค่าที่ใช้ในการขยาย .bakที่นี่มีสองค่าสตริงที่ว่างเปล่าและ
Stephen Kitt

12

การขยายประวัติจะมีประโยชน์สำหรับสิ่งนี้ (สมมติว่าเปิดใช้งานประวัติทุบตี)

ในตัวอย่างของคุณคุณสามารถทำได้:

cp /etc/prog/dir1/myconfig.yml !#:1.bak

ที่นี่!#หมายถึงบรรทัดปัจจุบัน!#:1อ้างถึงพารามิเตอร์ 1 ในบรรทัดปัจจุบัน
และ!#:1.bakอ้างถึงพารามิเตอร์ 1 ในบรรทัดปัจจุบันที่มี '.bak' ติดอยู่ที่ท้าย

เมื่อคุณพิมพ์ตัวระบุประวัติคุณสามารถใช้Ctrl+ Alt+ Eเพื่อขยายให้เป็นค่าจริงหากคุณต้องการตรวจสอบอีกครั้งหรือแก้ไขชื่อไฟล์

ส่วน "การขยายประวัติ" ในหน้า bash man มีข้อมูลเพิ่มเติม


8

คล้ายกับคำตอบของ progo แต่ค่อนข้างง่ายกว่า: C-wตัด (“ ฆ่า”) คำทางด้านซ้ายของเคอร์เซอร์C-yแทรก (“ yanks”) อีกครั้ง

$ cp /etc/dir1/myconfig.yml                              (C-w)
$ cp                                                     (C-y)
$ cp /etc/dir1/myconfig.yml                              (space, C-y)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml       (finish text)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml.bak

2
นอกจากนี้ยังมีข้อสังเกตว่าคุณสามารถทำได้หลายคำในหนึ่งแถว (หากชื่อไฟล์ของคุณมีช่องว่าง) และ Cy จะวางคำเหล่านั้นทั้งหมดตราบใดที่คุณยังไม่ได้ย้ายเคอร์เซอร์หรือพิมพ์สิ่งอื่นในระหว่างนั้น คำสั่งการลบแบบผสมยกเว้นการลบอักขระเดียว (เช่น backspace / del / ctrl-d) ใช้ได้กับสิ่งนี้
Random832

6

คุณยังสามารถตัดแปะ (kill-yank ในเงื่อนไข emacs / bash) จาก commandline ไปยังส่วนที่ซ้ำกันเพื่อแก้ไข

M-dส่งต่อไปจนถึงขอบเขตของคำและคุณสามารถฆ่าข้อความได้หลายครั้งและพวกมันทั้งหมดจะถูกรวมเข้าด้วยกันเป็น 'แปะ' สำหรับ yanking สะดวก!

งัดนี้ทั้งหมดกลับไปยัง commandline C-yที่เคอร์เซอร์โดย ดังนั้นหากคุณมีบรรทัดเช่นนี้ (องค์ประกอบบล็อก█บ่งชี้ตำแหน่งเคอร์เซอร์):

$ cp avb.txt                 (M-b M-b)
$ cpavb.txt                  (M-d) kill the word 'avb'
$ cp █.txt                    (C-y) yank it back
$ cp avb█.txt                 (C-e) to the end of line
$ cp avb.txt                 (C-y) yank it again
$ cp avb.txt avb             finish the line
$ cp avb.txt avb.foo

ไม่ว่าคุณจะชอบวิธีใดการทำความคุ้นเคยกับสิ่งที่ทุบตีเสนอในแผนกคีย์อินเทอร์แอคทีฟจะเป็นประโยชน์ http://web.mit.edu/gnu/doc/html/features_7.html


6

ในtcshหรือzsh, Alt+Ctrl+_ในemacsโหมด ( copy-prev-wordเครื่องมือ) แทรกคำพูดสุดท้ายดังนั้น

ซีพีมากยาวเส้นทางAlt+Ctrl+_.back

bashมีcopy-backward-wordวิดเจ็ต (ไม่ผูกติดกับปุ่มใด ๆ เป็นค่าเริ่มต้น) แต่เพียงคัดลอกคำไปยังบัฟเฟอร์แหวนคุณจะต้องกดCtrl-Y(ในemacsโหมด) เพื่อดึงมัน แต่คุณสามารถทำได้:

bind '"\e[cpw~": copy-backward-word'
bind '"\e\C-_": "\e[cpw~\C-Y"'

ที่จะมีการAlt+Ctrl+_ทำทั้งสองสำเนา / Snarf และวาง / งัดเหมือนใน/tcshzsh

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