วิธีแทนที่แท็บทั้งหมดในแต่ละไฟล์ในสาขาระบบไฟล์ด้วย 2 ช่องว่างแต่ละอัน?


10

ฉันใช้รหัสสกาล่าและการประชุมคือใช้ช่องว่างสองครั้งต่อระดับเพื่อระบุตัวตน แต่การใช้เครื่องมือแก้ไขที่แตกต่างกันทำให้แหล่งข้อมูลของฉันเต็มไปด้วยการผสมผสานของช่องว่างและแท็บ

ฉันต้องการ refactor ไฟล์ทั้งหมด (* .scala ไฟล์จริง แต่การระบุนี้ไม่จำเป็น) (ในไดเรกทอรีที่กำหนดและสาขา FS พื้นฐานทั้งหมด (แบบเรียกซ้ำ)) โดยอัตโนมัติแทนที่แท็บทั้งหมดด้วยช่องว่างสองครั้ง ฉันเชื่อว่ามีวิธีที่ง่ายและสวยงามในการทำเช่นนี้กับเครื่องมือ Unix / GNU แบบคลาสสิก แต่ฉันไม่มีประสบการณ์ในด้านนี้ คุณจะกรุณาช่วยฉันได้อย่างไร

คำตอบ:


9

ใช้ซ้ำexpand(ซึ่งสร้างขึ้นเพื่อจุดประสงค์นี้):find . -type f -name '*.scala' -exec bash -c 'for x in "$@"; do mv "$x"{,.bak} && expand -t 2 "$x.bak" > "$x" && rm "$x.bak"; done' {} +

ฉันจะทำมันด้วยsedหรือperl(ดูคำตอบของ Sardathrion) เพราะพวกเขาสนับสนุนการแก้ไขแบบอินไลน์ แต่ฉันต้องการพูดถึง ol ดี ' expandอย่างไรก็ตาม

แก้ไข: นั่นจะเป็น find . -type f -name '*.scala' -exec perl -p -i -e $'s/\t/ /g' {} +


ตัวแปรแรกทำงานตามที่คาดไว้ ตัวแปรที่สอง (perl) แทนที่แท็บที่มีเพียงหนึ่งช่องว่างแทนที่จะเป็นสองช่อง
อีวาน

ใช่ขอโทษ: นั่นเป็นความผิดพลาดของการจัดรูปแบบ ซอร์สโค้ดบอกว่ามีช่องว่างสองอัน แต่ HTML ที่แสดงผลจะแสดงเพียงช่องว่าง
janmoesen

10

สิ่งนี้ควรทำ:

find . -type f -name '*.scala$' -exec sed -i 's/\t/  /g' {} +

หมายเหตุ: นี่ไม่ได้ทดสอบ


1
สิ่งนี้ยังไม่เกิดซ้ำ คุณสามารถใช้findหรือเชลล์ที่รองรับ**/*.scalaการเรียกซ้ำ
janmoesen

แก้ไขเพื่อเพิ่มพฤติกรรมแบบเรียกซ้ำ ...
ซาดธีออน - ต่อต้านการล่วงละเมิดทาง SE

find | xargsกรุณาอย่าส่งเสริม ใช้find -execแทนเช่นที่ฉันพูดถึงในคำตอบของฉัน ง่ายและปลอดภัยยิ่งขึ้น
janmoesen

พยายามนี้ไม่มีผล คำสั่งส่งคืนทันทีและไม่มีอะไรเปลี่ยนแปลงภายในไฟล์
อีวาน

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