Computer >> คอมพิวเตอร์ >  >> สมาร์ทโฟน >> Linux

Linux command line magic – ค้นหาและแทนที่

คู่มือนี้จะแสดงวิธีค้นหาและแทนที่คำ สตริง หรือวลีในไฟล์และไดเร็กทอรี – ในขณะที่ใช้ Linux

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

สำหรับวัตถุประสงค์ของแบบฝึกหัดนี้ เราจะใช้เครื่องมือบรรทัดคำสั่งของ Linux ที่เรียกว่า “sed” “sed” เป็นเครื่องมือที่ทรงพลังและใช้งานได้หลากหลาย และสามารถเขียนเกี่ยวกับความสามารถของมันได้มากมาย เราใช้ "sed" ในแง่มุมที่จำกัดมากที่นี่ ฉันขอแนะนำให้คุณอ่านเพิ่มเติมเกี่ยวกับ “sed” อีกเล็กน้อย หากคุณพบว่าแง่มุมนี้น่าสนใจ

เราจะใช้ไวยากรณ์ต่อไปนี้เพื่อค้นหาและแทนที่สตริงข้อความในไฟล์:

# sed -i 's/[orginal_text]/[new_text]/' filename.txt

สมมติว่าคุณมีไฟล์ชื่อ “database.txt” ซึ่งมีที่อยู่ IP ของเซิร์ฟเวอร์ฐานข้อมูลของคุณอยู่เป็นจำนวนมาก คุณเพิ่งเปลี่ยนไปใช้เซิร์ฟเวอร์ฐานข้อมูลใหม่และจำเป็นต้องอัปเดตด้วยที่อยู่ IP ของเซิร์ฟเวอร์ใหม่ ที่อยู่ IP เก่าคือ 192.168.1.16 และที่อยู่ใหม่คือ 192.168.1.22 นี่คือวิธีการ:

# catdatabase.txt
LOCAL_DATABASE =192.168.1.16
LOCAL_DIR =/home/calvin/
PROD_DB =192.168.1.16

sed -i ‘s/192.168.1.16/192.168.1.22/g’ database.txt
# cที่database.txt
LOCAL_DATABASE =192.168.1.22
LOCAL_DIR =/home/calvin/
PROD_DB =192.168.1.22

ตอนนี้เปิดไฟล์ “database.inc” และตรวจดูว่ามีที่อยู่ IP ใหม่แทนที่ที่อยู่เก่าของคุณหรือไม่ นี่คือการแยกคำสั่งข้างต้น ก่อนอื่นคุณเรียกคำสั่ง "sed" จากนั้นคุณส่งพารามิเตอร์ "-s" ซึ่งย่อมาจาก "in place of" ตอนนี้เราใช้นิพจน์ทั่วไปเล็กน้อย หรือที่เรียกกันทั่วไปว่า “regex” สำหรับบิตถัดไป ตัว "s" ในสตริงที่ยกมาหมายถึง "substitution" และ "g" ที่ท้ายย่อมาจาก "global" ระหว่างข้อความเหล่านี้ส่งผลให้เกิด "การแทนที่สตริงข้อความที่คุณวางไว้ระหว่างข้อความทั่วโลก

คุณสามารถเลือกข้าม "g" ในตอนท้ายได้ ซึ่งหมายความว่าการแทนที่จะไม่เป็นแบบโกลบอล ซึ่งในทางปฏิบัติจะแปลเป็นการแทนที่เฉพาะอินสแตนซ์แรกของสตริงในบรรทัดเท่านั้น ดังนั้น หากคุณมีบรรทัดที่มีข้อความหลายอินสแตนซ์ที่คุณพยายามจะแทนที่ นี่คือสิ่งที่จะเกิดขึ้น

# catdatabase.txt
LOCAL_DATABASE =192.168.1.16
LOCAL_DIR =/home/calvin/
PROD_DB =192.168.1.16, 192.168.1.16

sed -i ‘s/192.168.1.16/192.168.1.22/’ database.txt
# catdatabase.txt
LOCAL_DATABASE =192.168.1.22
LOCAL_DIR =/home/calvin/
PROD_DB =192.168.1.22, 192.168.1.16

มายาของจริงมาแล้ว ตอนนี้ สมมติว่าคุณต้องการเปลี่ยนสตริงข้อความ ไม่ใช่แค่ในไฟล์เดียว แต่ในไดเร็กทอรีทั้งหมดที่คุณอยู่ มีไฟล์ข้อความจำนวนหนึ่งที่คุณต้องค้นหาและแทนที่ "ไวน์" ด้วย "แชมเปญ" .

# หา -maxdepth 1 -name “*.txt” -type f -exec sed -i 's/wine/champagne/' {} \

เราใช้คำสั่ง find เพื่อรับรายการไฟล์ข้อความทั้งหมดในไดเร็กทอรีปัจจุบัน นั่นคือ “หา -maxdepth 1 -name “*.txt” -type f” ส่วน "หา . maxdepth 1” บอกให้คอมพิวเตอร์ค้นหาในไดเร็กทอรีปัจจุบันและไม่ลึกไปกว่าไดเร็กทอรีปัจจุบัน ส่วน '-name  “*.txt”' บอกให้ค้นหาเฉพาะไฟล์ที่มีนามสกุลเป็น “.txt” จากนั้นส่วน "-type f" ระบุว่า "find" ควรเลือกเฉพาะไฟล์ที่ตรงกันเท่านั้น สุดท้ายส่วน "-exec" จะบอก "find" ให้รันคำสั่งที่ตามมา ซึ่งในกรณีนี้คือคำสั่ง "sed" เพื่อแทนที่ข้อความ - "sed -i 's/wine/champagne/' {} \ ”.

ตอนนี้คุณสามารถค้นหาและแทนที่สิ่งต่าง ๆ ในไฟล์ได้แล้ว ทำไมไม่ลองดูเคล็ดลับ Linux อื่นๆ ของเราสิ :)