แทนที่ข้อความในไฟล์ด้วยคำสั่งเดียว: perl

บางครั้งเราต้องการแก้ไขข้อความภายในไฟล์ เช่น เปลี่ยนข้อความ "my family" เป็น "us" ในไฟล์ Document.txtเราสามารถใช้โปรแกรมแก้ไขข้อความที่เราถนัด (เช่น Kate, Gedit, Sublime Text เป็นต้น) ในการทำเช่นนี้ แต่การรู้จักทางเลือกอื่นๆ หรือวิธีการอื่นๆ ที่ให้ผลลัพธ์เดียวกันนั้นก็เป็นเรื่องดีเสมอ

ปรากฏว่าสามารถทำได้ ด้วย นิพจน์ปกติ (regular expressions ) คำสั่ง `sed` นั้นยอดเยี่ยมมาก มีรูปแบบและตัวเลือกมากมายนับไม่ถ้วน แต่...สำหรับผู้ที่ต้องการแทนที่ข้อความด้วย วิธีที่ง่ายที่สุดเท่าที่จะเป็นไปได้ผมขอเสนอวิธีที่ง่ายกว่านี้:

จากตัวอย่าง เรามีไฟล์Document.txtอยู่ใน$HOME/Document.txtซึ่งมีข้อความดังต่อไปนี้:

ครอบครัวของฉันก็เหมือนกับครอบครัวอื่นๆ ทั่วไป เหมือนกับครอบครัวของคุณหรือครอบครัวเพื่อนบ้านของคุณนั่นแหละ ที่จริงแล้วครอบครัวของฉันพยายามทำตัวเป็นคนดีในสายตาของสังคม ทั้งในด้านการเมืองและสังคม แต่ก็มีแกะดำอยู่ในบ้านฉัน และนั่นก็คือบทบาทของฉันเอง ฮ่าๆ! ฉันเป็นคนที่กล้าพูดในสิ่งที่คิดเสมอ (ถึงแม้ว่ามันจะไม่เป็นที่ยอมรับในสังคมก็ตาม) แต่ในความเป็นจริงแล้ว ครอบครัวของฉันเบื่อหน่ายกับ สังคม ที่วุ่นวายในปัจจุบันเหลือเกิน

คำสั่งต่อไปนี้จะเปลี่ยน " ครอบครัวของฉัน " เป็น " พวกเรา ":

perl -pi -e "s[mi familia][nosotros]g" $HOME/Documento.txt

มันง่ายขนาดนั้น

ดังนั้นข้อความจะเป็น:

(...) บ้าน เราก็เหมือนบ้านของคนอื่นๆ ทั่วไป เหมือนบ้านของคุณหรือบ้านของเพื่อนบ้านคุณนั่นแหละ จริงๆ แล้วเราพยายามเป็นคนมีความรับผิดชอบในสายตาของสังคม ทั้งในด้านการเมืองและสังคมที่ถูกต้อง แต่ก็มีแกะดำอยู่ในบ้านฉัน และนั่นก็เป็นบทบาทของฉัน ฮ่าๆ! ฉันเป็นคนที่กล้าพูดในสิ่งที่คิดเสมอ (ถึงแม้ว่ามันอาจจะไม่ถูกต้องในสายตาของสังคมก็ตาม) ถึงแม้ว่าในความเป็นจริงแล้วครอบครัวของฉันจะเบื่อหน่ายกับความสกปรกโสมมของสังคมในปัจจุบัน แล้วก็ตาม

ไวยากรณ์คือ:

perl -pi -e "s[lo-que-quiero-cambiar][lo-nuevo-a-poner]g" archivo-en-el-cual-reemplazar

คำสั่งอาจดูซับซ้อนนิดหน่อย มาแยกย่อยกันหน่อยแล้วอธิบายให้ง่ายขึ้นอีกหน่อย 

  • Perl : สิ่งที่เราจะใช้ perl
  • -pi : Píอย่างไร π (ค่าประมาณ 3.14)
  • -e : E ลองนึกภาพสำหรับ« e เพื่อดำเนินการ» ^ - ^
  • จากนั้นในเครื่องหมายคำพูด » เราเปิดด้วยไฟล์ s และเราปิดด้วย g: "sg" …ลองนึกภาพ S สำหรับการเริ่มต้น และ G สำหรับจบเกม 
  • เลี้ยวระหว่าง sg เราต้องใส่วงเล็บสองชุด: [] y []เป็นอย่างนั้น: "S [] [] g"
  • ในวงเล็บแรกตามที่ฉันได้กล่าวไว้ข้างต้นข้อความที่เราต้องการลบและแทนที่ด้วยข้อความใหม่จะไปในขณะที่ในวงเล็บชุดที่สองข้อความใหม่ที่จะใส่จะไปตามตัวอย่าง: "S [ครอบครัวของฉัน] [เรา] g"

เรียบง่ายใช่ไหม

จริงๆ แล้วคำอธิบายนั้นยาวกว่าสิ่งที่จำเป็นสำหรับคำสั่งมาก มันค่อนข้างง่ายที่จะเข้าใจ 

Perl เป็นมากกว่าวิธีการแทนที่ข้อความ แต่เป็นทั้งภาษา 

หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ ให้ติดตั้ง แพ็กเกจ perl-docแล้วลองดูว่ามันทำอะไรได้บ้าง มันเป็นโลกที่แตกต่างออกไปอย่างสิ้นเชิง

โดยวิธีการและเพื่อปิดสมมติว่าคุณต้องการค้นหาไฟล์. txt ทั้งหมดที่คุณมีใน $ HOME / Documents / และในแต่ละไฟล์แทนที่ "my family" ด้วย "us" คุณสามารถเข้าร่วม find + perl เพื่อทำสิ่งนี้:

find $HOME/Documentos/ -name *.txt -exec perl -p -i -e "s[mi familia][nosotros]g" {} \;

หรือใช้สัญลักษณ์แทน:

perl -p -i -e "s[mi familia][nosotros]g" $HOME/Documentos/*.txt

ปัญหาของตัวแปรที่สองนี้คือ มันจะไม่แทนที่ไฟล์ที่อยู่ในโฟลเดอร์ย่อย 

อย่างไรก็ตาม ฉันหวังว่าคุณจะพบว่ามันน่าสนใจ สำหรับฉัน มันมีประโยชน์มาก ตอนนี้ฉันสามารถแทนที่ข้อความได้โดยตรงจากเทอร์มินัลแล้ว... เยี่ยมมาก!


เพิ่มเป็นแหล่งข้อมูลที่ต้องการใน Google