\f
เป็นอักขระฟีดฟอร์มใน Perl ดูเหมือนว่าไฟล์ที่มีรูปแบบไม่ถูกต้องเหล่านี้ถูกสร้างขึ้นโดยคนใหม่สำหรับทั้ง Perl และ XML
นี่คือการแก้ไข Perlier มาก - ซึ่งยังตรงกับเป้าหมาย OP ของอัตโนมัติปรับปรุงไฟล์ทั้งหมดที่แตกต่างจากคำตอบที่ได้รับการยอมรับกับ sed find
ซึ่งจะทำงานเพียงหนึ่งไฟล์ในเวลาที่มันไม่ได้จับคู่กับ
\f
x0c
ก็สามารถได้รับการว่าจ้างตัวเองแทนรหัสฐานสิบหก
find . -type f -exec perl -pi.bkp -e 's [ \f ilename ][ /f ilename ]gx' {} \;
ที่นี่ฉันได้เพิ่ม-type f
โทรfind
เข้าเพื่อส่งคืนไฟล์ธรรมดา - มิฉะนั้นfind
จะส่งคืน.
ในรายการและเรียกใช้คำเตือนเมื่อคุณพยายามแก้ไข แต่ทุกอย่างจะยังคงใช้งานได้
ฉันยังทำให้การมองเห็น regex ง่ายขึ้นโดยใช้x
แฟล็กซึ่งไม่สนใจช่องว่างที่แท้จริงช่วยให้คุณสามารถเว้นองค์ประกอบของ regex ของคุณ หากคุณไม่ชอบสิ่งนี้แสดงว่าไม่มี:
find . -type f -exec perl -pi.bkp -e 's[\filename][/filename]g' {} \;
และในกรณีที่เป็นไปได้ว่าตัวอักขระฟีดแบบฟอร์มทั้งหมดจะถูกปลอมและควรแทนที่ด้วยทั้งหมดจาก/f
นั้นคุณสามารถเพรียวบางซับลงได้อีก:
find . -type f -exec perl -pi.bkp -e 's[\f][/f]g' {} \;
คุณไม่จำเป็นต้องใช้เครื่องหมายทับซ้ายเพื่อล้อมองค์ประกอบของคำสั่งการแทนที่ regex ( s///
) ใน Perl คุณสามารถใช้สัญลักษณ์ใด ๆ หากคุณเลือกใช้สัญลักษณ์คล้ายวงเล็บคู่ใด ๆ คุณต้องใช้ทั้งสองอย่างs[old][new]
เช่น
เนื่องจากฉันไม่ได้ใช้สแลชฉันจึงไม่ต้องหนีเครื่องหมายสแลชใด ๆ
สำหรับ-i.bkp
: perl -pi -e
ช่วยให้คุณแก้ไขในสถานที่ - แต่ถ้าคุณต้องการประกันเพิ่มเติมในกรณีที่คุณพบโปรแกรม Perl ที่ค้นหาและแทนที่ไม่ถูกต้องคุณสามารถใส่นามสกุลไฟล์เพื่อที่จะทำสำเนาไฟล์ต้นฉบับสำหรับ คุณ. .bkp
ที่นี่ผมเคยใช้
ใน Perl เวอร์ชั่นล่าสุดการแก้ไขในสถานที่ได้รับการปรับปรุงให้มีความยืดหยุ่นมากขึ้นในกรณีที่ระบบของคุณประสบปัญหาร้ายแรงเช่นการสูญเสียพลังงานหรือการใช้พื้นที่ดิสก์ไม่เพียงพอ ที่นี่ผู้เขียน Perl คือไบรอัน d foy ในการปรับปรุงแก้ไขในสถาน Perls ล่าสุด
คุณควรพิจารณาใช้ Perl สำหรับงานประเภทนี้เพราะเป็นภาษาการเขียนโปรแกรมที่มีประสิทธิภาพสูง แต่ไม่ได้มาตรฐานอันดับหนึ่งซึ่งมีเป้าหมายการออกแบบดั้งเดิมคือการแทนที่sed
และแทนที่awk
ด้วยสิ่งที่ดีกว่ามาก
Perl 5 ความสามารถในการจับคู่ regex และไวยากรณ์ regex ดีขึ้นไกลเกินเหล่านั้นsed
, awk
และแน่นอนทุกภาษาโปรแกรมอื่น ๆ นอกเหนือจาก Perl 6 ทำให้ Perl เป็นทางเลือกที่เหมาะสมที่สุดสำหรับทั้งง่ายและกิจวัตร regex ขั้นสูง
ชี้แจง: sed
จะทำงานด้วยfind
และคุณยังสามารถใช้sed -i.bkp
ในการสำรองข้อมูลของแต่ละไฟล์ที่แก้ไข แต่เท่าที่ฉันรู้ว่ามันไม่ได้มีความยืดหยุ่นพิเศษใน Perl 5.28 ขึ้นไป นอกจากนี้ยังใช้ clunkier และไวยากรณ์ UNIX ®แบบดั้งเดิมที่มีประสิทธิภาพน้อยกว่ามาก
<\filename>
แทน</filename>
ในบริบทที่\f
อาจตีความได้ว่าเป็นอักขระฟีดฟอร์ม คุณควรติดตามแหล่งที่มาของไฟล์เหล่านี้และชี้ให้เห็นปัญหาเกี่ยวกับเครื่องมือสร้างไฟล์ของพวกเขาให้กับนักพัฒนา สำหรับการแก้ไขไฟล์คำตอบที่ยอมรับก็ใช้ได้