Bash:
แก้ไขไฟล์ในที่เดิมด้วย CLI one-liners
วิธีทำ:
เมื่อต้องการแก้ไขไฟล์แบบอินเพลสโดยใช้ Bash มีเครื่องมือสองอันที่โดดเด่นคือ sed
และ awk
มาดูวิธีใช้ยูทิลิตี้ที่ทรงพลังเหล่านี้ด้วยตัวอย่างโค้ดบางส่วน
การใช้ sed
สำหรับการแทนที่ข้อความง่ายๆ
คำสั่งต่อไปนี้แทนที่ครั้งแรกของ “text1” ด้วย “text2” ใน file.txt
:
sed -i 's/text1/text2/' file.txt
สำหรับการแทนที่ทั่วโลก (ทุกครั้งที่เกิดขึ้น) คุณจะเพิ่ม g
ตอนท้าย:
sed -i 's/text1/text2/g' file.txt
เพื่อแก้ไขไฟล์หลายไฟล์พร้อมกัน:
sed -i 's/text1/text2/g' file1.txt file2.txt file3.txt
การใช้ awk
สำหรับการจัดการที่ซับซ้อนกว่า
awk
เป็นเครื่องมืออีกอันที่โดดเด่นด้วยความสามารถด้านการเขียนโปรแกรม โดยเฉพาะสำหรับการประมวลผลข้อความที่เกี่ยวข้องกับข้อมูลที่มีฐานของฟิลด์
เปลี่ยนฟิลด์ที่สองของทุกบรรทัดเป็น newValue
ใน data.csv
, แยกด้วยจุลภาค:
awk -i inplace -F, '{$2="newValue"; print $0}' OFS=, data.csv
สำรองข้อมูลก่อนกระโดดลงไป
คำแนะนำที่ปฏิบัติได้จริงหนึ่งข้อ: สร้างสำเนาสำรองก่อนการแก้ไขแบบอินเพลสเสมอ sed
ช่วยให้ทำเช่นนี้ได้ด้วยตัวเลือก -i
ตามด้วยส่วนขยายเพื่อสร้างสำเนาสำรอง
sed -i.bak 's/text1/text2/g' file.txt
คำสั่งนี้สร้างสำเนาสำรองของ file.txt
ต้นฉบับเป็น file.txt.bak
ก่อนทำการแทนที่
การทำงานลึก
ความสามารถในการแก้ไขไฟล์โดยตรงจากบรรทัดคำสั่งเกิดขึ้นเป็นผลสืบเนื่องอย่างธรรมชาติจากปรัชญา Unix: การเพิ่มพลังให้ผู้ใช้ในการจัดการและปรับเปลี่ยนข้อมูลด้วยการกดปุ่มให้น้อยที่สุดเท่าที่จะทำได้ อย่างไรก็ตาม พลังนี้มาพร้อมกับข้อเตือนใจ
บริบทประวัติศาสตร์
เครื่องมือ Unix เช่น sed
และ awk
ได้ถูกสร้างขึ้นตั้งแต่วันแรกของ Unix ซึ่งถูกออกแบบมาเป็นส่วนหนึ่งของปรัชญาเครื่องมือ (Toolkit Philosophy) โดยมุ่งเน้นที่คำสั่งที่เชี่ยวชาญและสามารถประกอบกันได้ การรวมเครื่องมือเหล่านี้เข้ากับอาร์เซนอลของ Unix เป็นการตอบสนองต่อความต้องการการประมวลผลข้อความอย่างมีประสิทธิภาพในสภาพแวดล้อมที่มีการใช้งานอินเทอร์เฟซบรรทัดคำสั่งเป็นหลัก
ทางเลือก
ถึงแม้ sed
และ awk
จะมีพลังมาก แต่ก็ไม่ใช่ตัวเลือกเดียว Perl และ Python ตัวอย่างเช่น มีตัวเลือกบรรทัดคำสั่ง (-p
และ -i
ตามลำดับ) ที่อนุญาตให้ทำการแก้ไขแบบอินเพลสได้คล้ายกันด้วยไวยากรณ์ที่อ่านได้ง่ายขึ้นสำหรับการดำเนินการที่ซับซ้อน
perl -pi -e 's/text1/text2/g' file.txt
python -c "import fileinput, sys; [sys.stdout.write(line.replace('text1', 'text2')) for line in fileinput.input(files='file.txt', inplace=True)]"
แต่ละทางเลือกมีจุดแข็งของตนเอง: ความสามารถของ Perl ในการเขียนโค้ดแบบวันไลน์นั้นมากมาย และไวยากรณ์ของ Python อาจเข้าถึงได้ง่ายกว่าสำหรับผู้ที่ไม่คุ้นเคยกับเครื่องมือการประมวลผลข้อความของ Unix อย่างลึกซึ้ง
รายละเอียดการดำเนินการ
การแก้ไขแบบอินเพลสไม่ใช่ “แบบอินเพลส” อย่างแท้จริงในทางเทคนิค sed -i
และ awk -i inplace
ทำงานโดยการสร้างไฟล์ชั่วคราวที่เก็บผลลัพธ์ที่ได้รับการประมวลผลไว้ก่อนที่จะทำการเปลี่ยนไฟล์ต้นฉบับ วิธีการนี้ช่วยให้แน่ใจว่าไฟล์จะไม่เสียหายหากกระบวนการถูกขัดจังหวะ ผลกระทบหลักอยู่ที่ทรัพยากรและสิทธิ์: คุณต้องมีพื้นที่ดิสก์เพียงพอสำหรับไฟล์ชั่วคราวและมีสิทธิ์ในการสร้างไฟล์ในไดเร็กทอรีของไฟล์เป้าหมายของคุณ
แม้ว่าคำสั่งแก้ไขแบบอินเพลสจะมีพลังมาก แต่ก็ต้องใช้ด้วยความระมัดระวัง การใช้ regex ที่ไม่ถูกต้องอาจส่งผลให้เกิดการสูญเสียข้อมูล ซึ่งส่งเสริมความสำคัญของการสำรองข้อมูล แม้จะมีข้อจำกัดที่อาจเกิดขึ้น การเชี่ยวชาญคำสั่งเหล่านี้สามารถเพิ่มประสิทธิภาพการทำการแก้ไขไฟล์อย่างรวดเร็วและมีประสิทธิภาพโดยตรงจากบรรทัดคำสั่งได้อย่างมาก เป็นการสืบทอดปรัชญา Unix ที่ใช้เครื่องมือที่ง่ายแต่ทรงพลังเพื่อทำงานที่ซับซ้อน