วิธีแก้ไขไฟล์โดยใช้โปรแกรมโดยใช้เทอร์มินัลเท่านั้น


13

ฉันต้องการเขียนเชลล์สคริปต์โดยที่ฉันสามารถอ่านไฟล์จากคำสั่งและแก้ไขไฟล์โดยไม่ต้องดำเนินการด้วยตนเอง (ขึ้นอยู่กับการค้นหาข้อความและแทนที่ด้วยอื่น)

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

คำตอบ:


10

นั่นคือที่sedมาในการเล่น sedคำสั่งมีรูปแบบนี้:

[pattern1][,pattern2][!] command [args]

มันใช้ regexes เพื่อให้สามารถ / จะค่อนข้างยาก ตัวอย่างพื้นฐานที่นำมาจากลิงค์ที่ 2 ด้านล่าง:

# replace (ค้นหาและแทนที่) "foo" ด้วย "bar" ในแต่ละบรรทัด
sed 's / foo / bar /' # แทนที่อินสแตนซ์ที่ 1 เท่านั้นในบรรทัด
sed 's / foo / bar / 4' # แทนที่เฉพาะอินสแตนซ์ที่ 4 ในบรรทัด
sed 's / foo / bar / g' # แทนที่ทุกอินสแตนซ์ในหนึ่งบรรทัด
sed 's / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 /' # แทนที่กรณีถัดไปสุดท้าย
sed 's / \ (. * \) foo / \ 1bar /' # แทนที่เฉพาะกรณีสุดท้าย

# ทดแทน "foo" ด้วย "bar" สำหรับบรรทัดที่มี "baz" เท่านั้น
sed '/ baz / s / foo / bar / g'

# ทดแทน "foo" ด้วย "bar" ยกเว้นสำหรับบรรทัดที่มี "baz"
sed '/ baz /! s / foo / bar / g'

# เปลี่ยน "scarlet" หรือ "ruby" หรือ "puce" เป็น "red"
sed 's / สีแดงเข้ม / แดง / g; s / ruby ​​/ red / g; s / puce / red / g' # seds มากที่สุด
gsed 's / scarlet \ | ruby ​​\ | puce / red / g' # GNU เท่านั้น

อ้างอิงบางอย่าง


7

คำตอบที่ล่าช้ามาก อย่างไรก็ตามสิ่งนี้อาจช่วยผู้อื่นในปัญหา / คำถามที่คล้ายกัน

ฉันอยากจะแนะนำการสร้างและการใช้แพทช์ เป็นตัวอย่างที่ดีที่สามารถพบได้ ที่นี่

ตัวอย่างเช่นสมมติว่าไฟล์ new.txt มีการเปลี่ยนแปลงที่คุณต้องการใช้กับ old.txt คุณสามารถดำเนินการคำสั่งบนเทอร์มินัลหรือโดยการสร้างและดำเนินการ patch_file.sh

บรรทัดคำสั่ง: เปิดเทอร์มินัลแล้วคัดลอกและดำเนินการบรรทัดด้านล่าง (เปลี่ยนชื่อไฟล์ตามที่จำเป็น):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

สคริปต์: ใช้วิธีการไฟล์. sh ในเทอร์มินัล (คีย์บอร์ด: ctrl + alt + t: gedit patch_file.sh

คัดลอกและวางคำสั่งที่จะไปยังเทอร์มินัลไปยังไฟล์. sh และใต้ส่วนหัวดังแสดงด้านล่าง (gedit)

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

ทำให้สคริปต์เรียกใช้งานได้ (เทอร์มินัล):

chmod +x patch_file.sh

เรียกใช้สคริปต์ (เทอร์มินัล):

./patch_file.sh # may require sudo access depending on the directory affected

+1 patch เป็นวิธีที่ตรงไปตรงมาสำหรับการดัดแปลงขนาดกลางถึงหนักหรือซับซ้อน ฉันไม่รู้ว่าทำไมบางคนพยายามทำทุกอย่างด้วยเครื่องมือ regex
user.dz

+1 ดีกว่าวิศวกรรมย้อนกลับ regex ที่ดูเหมือนว่าจะใช้การเปลี่ยนแปลงที่คุณต้องการในไฟล์ที่คุณทดสอบด้วย ... แต่เมื่อนำไปใช้กับอินสแตนซ์อื่นของไฟล์นั้นบางครั้งก็มีผลกระทบอื่น ๆ
bigjosh

โปรแกรมแก้ไขมีเหตุผลหรือไม่ถ้าฉันต้องการแทนที่ทุกอินสแตนซ์ของสตริงข้อความที่ระบุเช่นแทนที่ "" ด้วย "_", "ลบ" ทั้งหมดด้วย "-" และ "gb | <string_of_numbers> ทั้งหมด ARO:" ด้วย " ARO: "? ขอบคุณ
Josh

1

หากคุณต้องการที่จะแก้ไขไฟล์, การใช้โปรแกรมแก้ไขไฟล์ที่มีคำสั่งตามบรรณาธิการแฟ้มที่สามารถนำมาใช้จากสคริปต์เช่นอดีตหรือเอ็ด


1

คุณกำลังมองหา sed หรือ awk ฉันพบว่าใจที่จะเรียบง่ายขึ้นและมีพลังมากขึ้น

นี่คือตัวอย่างจากคำถามอื่น

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

หมายความว่า:

  • ค้นหาในไฟล์ /usr/share/applications/defaults.list
  • ค้นหา / grep gedit.desktop
  • แทนที่ด้วย yournew.desktop
  • ใช้การเปลี่ยนแปลงที่เกิดขึ้น -i

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