Computer >> Máy Tính >  >> Điện thoại thông minh >> Linux

Phép thuật dòng lệnh Linux - tìm và thay thế

Hướng dẫn này sẽ chỉ cho bạn cách tìm và thay thế các từ, chuỗi hoặc cụm từ trong tệp và thư mục - khi sử dụng Linux.

Khi bạn đang làm việc trên dòng lệnh Linux và bạn gặp một tệp lớn hoặc một số lượng lớn tệp mà bạn cần thay thế một văn bản nhất định bằng một văn bản khác, việc tìm và dán từng phiên bản của văn bản có thể hơi mất thời gian. Chà, đừng lo lắng nữa. Linux có giải pháp cho bạn. Đây là cách tự động tìm và thay thế một chuỗi văn bản trong một hoặc nhiều tệp.

Với mục đích của bài tập này, chúng tôi sẽ sử dụng một công cụ dòng lệnh Linux có tên là “sed”. “Sed” là một công cụ rất mạnh mẽ và linh hoạt, có thể viết rất nhiều về khả năng của nó. Chúng tôi đang sử dụng một khía cạnh rất hạn chế của “sed” ở đây. Tôi chắc chắn khuyên bạn nên đọc thêm một chút về “sed” nếu bạn thấy khía cạnh này của nó thú vị.

Chúng tôi sẽ sử dụng cú pháp sau để tìm và thay thế một chuỗi văn bản trong một tệp:

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

Giả sử bạn có một tệp có tên “database.txt” với nhiều bản sao địa chỉ IP của máy chủ cơ sở dữ liệu của bạn trong đó. Bạn vừa chuyển sang một máy chủ cơ sở dữ liệu mới và cần cập nhật nó bằng địa chỉ IP của máy chủ mới. Địa chỉ IP cũ là 192.168.1.16 và địa chỉ mới là 192.168.1.22. Đây là cách bạn thực hiện:

# cat database.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 tại database.txt
LOCAL_DATABASE =192.168.1.22
LOCAL_DIR =/ home / calvin /
PROD_DB =192.168.1.22

Bây giờ, hãy mở tệp “database.inc” và kiểm tra xem liệu địa chỉ IP mới có thay thế cho địa chỉ IP cũ của bạn hay không. Đây là phần chia nhỏ của lệnh trên. Đầu tiên bạn gọi lệnh “sed”. Sau đó, bạn chuyển cho nó tham số “-s” là viết tắt của “thay cho”. Bây giờ chúng tôi sử dụng một chút biểu thức chính quy, thường được gọi là “regex” cho bit tiếp theo. Chữ "s" trong chuỗi được trích dẫn là viết tắt của "thay thế", và chữ "g" ở cuối là viết tắt của "toàn cầu". Giữa chúng, chúng dẫn đến “sự thay thế toàn cầu của chuỗi văn bản bạn đặt giữa chúng.

Bạn có thể tùy ý bỏ qua “g” ở cuối. Điều này có nghĩa là sự thay thế sẽ không mang tính toàn cục, điều này thực tế chuyển thành sự thay thế chỉ phiên bản đầu tiên của chuỗi trong một dòng. Vì vậy, nếu bạn có một dòng có nhiều bản sao của văn bản mà bạn đang cố gắng thay thế, thì đây là điều sẽ xảy ra

# cat database.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
# cat database.txt
LOCAL_DATABASE =192.168.1.22
LOCAL_DIR =/ home / calvin /
PROD_DB =192.168.1.22, 192.168.1.16

Đây là điều kỳ diệu thực sự. Bây giờ, giả sử bạn muốn thay đổi một chuỗi văn bản không chỉ trong một tệp đơn lẻ mà trong toàn bộ thư mục bạn đang ở. Có một số tệp văn bản mà bạn cần tìm và thay thế “wine” bằng “sâm panh” .

# tìm. -maxdepth 1 -name “* .txt” -type f -exec sed -i ‘s / wine / champagne /’ {} \

Chúng tôi sử dụng lệnh find để lấy danh sách tất cả các tệp văn bản trong thư mục hiện tại. Đó là “tìm thấy. -maxdepth 1 -name “* .txt” -type f ”part. "tìm thấy . maxdepth 1 ”yêu cầu máy tính tìm trong thư mục hiện tại và không đi sâu hơn thư mục hiện tại. Phần ‘-name“ * .txt ”‘ yêu cầu tìm chỉ liệt kê các tệp có phần mở rộng là “.txt”. Sau đó, phần “-type f” chỉ định rằng “find” chỉ nên chọn các tệp trùng khớp chính xác. Cuối cùng, phần “-exec” yêu cầu “find” thực hiện lệnh theo sau, trong trường hợp này, là lệnh “sed” để thay thế văn bản - “sed -i 's / wine / champagne /' {} \ ”.

Bây giờ bạn có thể tìm và thay thế mọi thứ trong tệp, tại sao không xem các mẹo Linux khác của chúng tôi :)