คุณสามารถทำสิ่งที่หยาบกับสคริปต์ Perl ขนาดเล็กซึ่งได้รับคำสั่งให้ดำเนินการเปลี่ยนบรรทัดโดยบรรทัด ( -l -pe
) ในสถานที่ในไฟล์ที่ส่งผ่านเป็นอาร์กิวเมนต์ ( -i
):
perl -i -l -pe '
if (/from/) { # is the source text present on this line?
printf STDERR ("%s: %s [y/N]? ", $ARGV, $_); # display a prompt
$r=<STDIN>; # read user response
if ($r =~ /^[Yy]/) { # if user entered Y:
s/from/to/g; # replace all occurences on this line
}' /path/to/files
การปรับปรุงที่เป็นไปได้คือการทำสีส่วนต่างๆของพรอมต์และสนับสนุนสิ่งต่าง ๆ เช่น“ แทนที่สิ่งที่เกิดขึ้นทั้งหมดในไฟล์ปัจจุบัน” การถามแยกกันสำหรับแต่ละเหตุการณ์บนบรรทัดจะยากขึ้น
ส่วนที่สองจับคู่ไฟล์ หากไม่มีไฟล์ที่เกี่ยวข้องมากเกินไปและคุณกำลังเรียกใช้ zsh คุณสามารถจับคู่ไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยซ้ำ:
perl -i -l -pe '…' **/*(.)
หากเชลล์ของคุณทุบตี≥4คุณสามารถเรียกใช้perl … **/*
แต่นั่นจะสร้างข้อความแสดงข้อผิดพลาดปลอมเพราะ sed จะพยายาม (และล้มเหลว) ให้เรียกใช้บนไดเรกทอรี หากคุณต้องการทำการแทนที่ในชุดของไฟล์เช่นไฟล์ C เท่านั้นคุณสามารถ จำกัด การจับคู่ (ซึ่งใช้ได้กับ bash ≥4หรือ zsh):
perl -i -l -pe '…' **/*.[hc]
หากคุณต้องการควบคุมปลีกย่อยมากกว่าที่ไฟล์ที่คุณกำลังแทนที่หรือเปลือกของคุณไม่ได้สร้างการจับคู่ไดเรกทอรี recursive **
หรือถ้าคุณมีไฟล์มากเกินไปและได้รับ“บรรทัดคำสั่งยาวเกินไปข้อผิดพลาด” find
การใช้งาน ตัวอย่างเช่นในการแทนที่ไฟล์ทั้งหมดที่มีชื่อ*.h
หรือ*.c
ในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย (ในระบบเก่าคุณอาจต้องใช้\;
แทนที่+
ท้ายบรรทัด ( +
แบบฟอร์มเร็วกว่า แต่ไม่สามารถใช้ได้ทุกที่)
find . -type f -name '*.[hc]' -exec perl -i -l -pe '…' {} +
ที่ถูกกล่าวว่าฉันจะติดแก้ไขบรรณาธิการหากคุณต้องการการโต้ตอบ Gert ได้แสดงวิธีการนี้ใน Vimแม้ว่าจะต้องเปิดไฟล์ทั้งหมดที่คุณต้องการค้นหาซึ่งอาจเป็นปัญหาหากมีจำนวนมาก
ใน Emacs นี่คือวิธีที่คุณสามารถทำได้:
- รวบรวมชื่อไฟล์ด้วย
M-x find-name-dired
(ระบุไดเรกทอรีระดับบนสุด) หรือM-x find-dired
(ระบุfind
บรรทัดคำสั่งโดยพลการ)
- ในบัฟเฟอร์dired ที่เป็นผลลัพธ์ให้กด
t
เพื่อทำเครื่องหมายไฟล์ทั้งหมดจากนั้นQ
( dired-do-query-replace-regexp
)เพื่อดำเนินการแทนที่โดยพร้อมท์กับไฟล์ที่ทำเครื่องหมายไว้
s/from/to/g
ด้วยความผิดพลาดของการจัดรูปแบบหลังจากนั้นแทนที่จะs/from/to/gc
เน้นที่สิ่งc
ที่คุณพยายามจะเขียน (คุณไม่สามารถทำได้ด้วย Markdown คุณสามารถทำได้ด้วย<code>
และ<strong>
แท็ก HTML)