\fเป็นอักขระฟีดฟอร์มใน Perl ดูเหมือนว่าไฟล์ที่มีรูปแบบไม่ถูกต้องเหล่านี้ถูกสร้างขึ้นโดยคนใหม่สำหรับทั้ง Perl และ XML
นี่คือการแก้ไข Perlier มาก - ซึ่งยังตรงกับเป้าหมาย OP ของอัตโนมัติปรับปรุงไฟล์ทั้งหมดที่แตกต่างจากคำตอบที่ได้รับการยอมรับกับ sed findซึ่งจะทำงานเพียงหนึ่งไฟล์ในเวลาที่มันไม่ได้จับคู่กับ
\fx0cก็สามารถได้รับการว่าจ้างตัวเองแทนรหัสฐานสิบหก
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อาจตีความได้ว่าเป็นอักขระฟีดฟอร์ม คุณควรติดตามแหล่งที่มาของไฟล์เหล่านี้และชี้ให้เห็นปัญหาเกี่ยวกับเครื่องมือสร้างไฟล์ของพวกเขาให้กับนักพัฒนา สำหรับการแก้ไขไฟล์คำตอบที่ยอมรับก็ใช้ได้