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 ที่ใช้เครื่องมือที่ง่ายแต่ทรงพลังเพื่อทำงานที่ซับซ้อน