6 cách tìm và thay thế văn bản trong Linux Terminal

Tác giả Starlink, T.M.Một 09, 2024, 01:03:09 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Việc chỉnh sửa tệp cấu hình hoặc cập nhật một tài liệu lớn bằng cách duyệt từng dòng thủ công có thể mất nhiều thời gian. Tuy nhiên, với các công cụ dòng lệnh như sed, awk, Vim và các công cụ khác, bạn có thể thực hiện quy trình tìm kiếm và thay thế nhanh chóng và hiệu quả.


1. Sử dụng lệnh sed

Bạn muốn thay thế văn bản nhanh chóng? Sử dụng lệnh sed. Với sed, bạn có thể tìm kiếm và sửa đổi văn bản trong các tệp, xử lý mọi thứ từ việc thay thế đơn giản đến các thao tác văn bản phức tạp.

Giả sử bạn có một tệp có tên example.txt chứa từ "Linux" và bạn quyết định thay thế nó bằng "Windows". Để thực hiện việc này, hãy chạy:

Mã nguồn [Chọn]
sed 's/Linux/Windows/g' example.txt

Ở đây, cờ s tượng trưng cho thay thế và cờ g cho phép sed thay thế tất cả các lần xuất hiện mẫu trên mỗi dòng.

Lệnh trước không trực tiếp sửa đổi tệp gốc; nó chỉ hiển thị đầu ra đã sửa đổi trong terminal. Tuy nhiên, nếu bạn muốn thao tác trực tiếp tệp gốc, hãy sử dụng cờ -i :

Mã nguồn [Chọn]
sed -i 's/Linux/Windows/g' example.txt
Cờ -i thực hiện thay đổi trực tiếp trong tệp thay vì chỉ hiển thị đầu ra.

Bạn muốn sao lưu tệp của mình trước khi thực hiện thay đổi? Thêm phần mở rộng vào cờ -i :

Mã nguồn [Chọn]
sed -i.bak 's/Linux/Windows/g' example.txt
Thao tác này sẽ tạo một tệp sao lưu có tên example.txt.bak trước khi thực hiện bất kỳ thay đổi nào.

Nhưng nếu bạn muốn file gốc của mình không thay đổi thì sao? Bạn có thể tạo một file mới và lưu đầu ra đã sửa đổi ở đó bằng cách sử dụng toán tử chuyển hướng.

Ví dụ, để gửi đầu ra tới một tệp riêng biệt, hãy sử dụng:

Mã nguồn [Chọn]
sed 's/Linux/Windows/g' example.txt > file.txt
Sử dụng các mẫu regex phức tạp với sed cho phép bạn kiểm soát những gì cần thay thế trong các tệp lớn hơn có nội dung lặp lại. Để thay thế nhiều trường hợp bằng một lệnh duy nhất, hãy chạy:

Mã nguồn [Chọn]
sed -i 's/Linux|Ubuntu/Windows/g' example.txt
Một mẹo tôi thường dùng với sed là chuyển sang một dấu phân cách khác nếu chuỗi tìm kiếm hoặc thay thế của tôi chứa dấu gạch chéo. Ví dụ, khi tôi làm việc với đường dẫn tệp, tôi thích sử dụng ký hiệu @ làm dấu phân cách:

Mã nguồn [Chọn]
sed 's@old/path@new/path@g' file.txt

Điều này làm cho lệnh dễ đọc hơn và tránh phải sử dụng nhiều ký tự thoát.

2. Thay thế văn bản bằng lệnh awk

Giống như sed, awk cũng thực hiện thao tác văn bản từ đơn giản đến nâng cao. Tôi thường sử dụng awk để xử lý dữ liệu có cấu trúc, đặc biệt là với các tệp CSV, nơi có thể cần tính toán trên các trường đã chọn.

Mặc dù awk nổi tiếng trong việc quản lý dữ liệu có cấu trúc, nhưng nó cũng hiệu quả đối với các tác vụ tìm và thay thế nhanh. Ví dụ, để thay thế văn bản cụ thể trong một tệp, bạn có thể sử dụng:

Mã nguồn [Chọn]
awk '{gsub(/Windows/, "Linux"); in}' file.txt > new_file.txt

Ở đây, hàm gsub thực hiện thay thế toàn cục, thay thế mọi lần xuất hiện "Windows" bằng "Linux" trên mỗi dòng trong tệp. Vì awk không sửa đổi tệp trực tiếp, chúng tôi chuyển hướng đầu ra đến new_file.txt để nắm bắt các thay đổi.

Tôi cũng sử dụng awk để dọn dẹp dữ liệu xuất, đặc biệt là từ bảng tính, nơi định dạng bổ sung có thể làm phức tạp quá trình xử lý dữ liệu. Nhiều bản xuất bảng tính bao gồm dấu ngoặc kép quanh giá trị, có thể làm gián đoạn quá trình xử lý dữ liệu trong các ứng dụng khác.

Bạn có thể xóa tất cả dấu ngoặc kép khỏi cột đầu tiên của tệp CSV bằng lệnh này:

Mã nguồn [Chọn]
awk -F, '{gsub(/"/, "", $1); print}' data.csv > cleaned_data.csv
Tại đây, gsub xóa mọi dấu ngoặc kép khỏi cột đầu tiên và đầu ra được chuyển hướng đến cleanse_data.csv để sử dụng sau này.

3. Thay thế văn bản bằng Vim Ex Mode

Bạn muốn chuyển đổi văn bản nhanh chóng mà không cần mở trình soạn thảo đầy đủ ? Hãy thử Vim (Vi Improved), một trình soạn thảo văn bản có chế độ Ex cho phép bạn thực hiện các thao tác tìm và thay thế trực tiếp từ dòng lệnh.

Để bắt đầu, hãy mở tệp của bạn bằng Vim:

Mã nguồn [Chọn]
vim filename.txt
Sau đó, nhập vào chế độ Ex bằng cách nhấn Esc, rồi sử dụng phím (:). Thao tác này sẽ nhắc bạn bằng dấu hai chấm (:) ở cuối terminal, cho biết bạn đang ở chế độ Ex. Để tìm và thay thế văn bản, hãy sử dụng lệnh này:

Mã nguồn [Chọn]
:%s/macOS/Linux/g

Lệnh này thay thế tất cả các lần xuất hiện của "macOS" bằng "Linux" trong toàn bộ tệp. Ký hiệu % chỉ định rằng lệnh sẽ áp dụng cho toàn bộ tệp và cờ g ở cuối đảm bảo tất cả các lần xuất hiện trên mỗi dòng được thay thế, không chỉ lần đầu tiên.

Để chỉ thay thế lần xuất hiện đầu tiên trên mỗi dòng, chỉ cần bỏ cờ g :

Mã nguồn [Chọn]
:%s/macOS/Linux/
Bạn cần thay thế văn bản trong một phạm vi dòng cụ thể? Hãy chỉ định phạm vi dòng. Ví dụ, để thay thế văn bản từ dòng 3 đến dòng 10:

Mã nguồn [Chọn]
:3,10s/macOS/Linux/g
Một thói quen tôi tuân theo khi thực hiện thay đổi tệp là xác nhận mỗi lần thay thế. Cách tiếp cận này cho phép chỉnh sửa cẩn thận từng dòng.

Để nhận được lời nhắc cho mỗi lần thay thế, hãy thêm c vào cuối lệnh:

Mã nguồn [Chọn]
:%s/macOS/Linux/gc
4. Sử dụng Bash Script

Đôi khi, bạn có thể cần thực hiện một loạt các hoạt động tìm và thay thế trên nhiều tệp hoặc thư mục. Đối với những trường hợp này, sử dụng tập lệnh Bash có thể tự động hóa các tác vụ mà bạn sẽ mất nhiều thời gian để thực hiện thủ công.

Hãy xem xét một tập lệnh đơn giản thay thế một chuỗi cũ bằng một chuỗi mới trong nhiều tệp văn bản trong thư mục hiện tại:

Mã nguồn [Chọn]
#!/bin/bash
for file in *.txt; do
    sed -i 's/Windows/Linux/g' "$file"
done


Để sử dụng tập lệnh này, trước tiên hãy lưu nó vào một tệp (ví dụ:   Đăng nhập để xem liên kết), sau đó thực thi tệp bằng cách chạy:

Mã nguồn [Chọn]
chmod +x bashexample.sh
Sau đó, thực thi tập lệnh với:

Mã nguồn [Chọn]
./bashexample.sh
Vòng lặp for lặp lại tất cả các tệp văn bản trong thư mục hiện tại và sử dụng sed để thay thế văn bản trong mỗi tệp. Bạn cũng có thể sửa đổi tập lệnh này để xử lý các mẫu hoặc loại tệp khác nhau khi cần.

5. Thay thế văn bản bằng tập lệnh Python

Với khả năng xử lý văn bản nâng cao của Python, bạn có thể thực hiện các tác vụ tìm và thay thế trên các tệp trực tiếp từ thiết bị đầu cuối. Các tập lệnh Python hữu ích khi bạn muốn các hoạt động phức tạp hơn, chẳng hạn như xử lý nhiều tệp bằng logic có điều kiện.

Đầu tiên, tạo một tệp Python mới. Bạn có thể sử dụng bất kỳ trình soạn thảo văn bản nào, chẳng hạn như nano hoặc Vim:

Mã nguồn [Chọn]
vim textfile.py
Tiếp theo, thêm đoạn mã Python sau vào tệp:

Mã nguồn [Chọn]
#!/usr/bin/env python
import sys
with open(sys.argv[1], 'r+') as f:
    content = f.read().replace('Windows', 'Linux')
    f.seek(0)
    f.write(content)
    f.truncate()

Sau khi lưu tệp, hãy thực thi tệp bằng cách chạy:

Mã nguồn [Chọn]
chmod +x ./testfile.py
Sau đó, chạy tập lệnh bằng cách truyền tệp mục tiêu dưới dạng đối số dòng lệnh:

Mã nguồn [Chọn]
python3 ./testfile.py input.txt
Tập lệnh này đọc nội dung của input.txt, thay thế các phần văn bản cũ bằng văn bản mới và lưu trực tiếp các thay đổi vào tệp.

6. Thay thế bộ ký tự bằng lệnh tr

Bạn đã bao giờ cần thay thế chỉ một ký tự bằng một ký tự khác trong toàn bộ tệp chưa? Nếu có, thì bạn cần thử lệnh tr. Lệnh này hoàn hảo cho việc thay thế hoặc xóa ký tự đơn giản.

Ví dụ, tôi thường sử dụng nó để chuyển đổi các ký tự cụ thể trong tệp văn bản thành chữ hoa hoặc chữ thường. Để thay thế tất cả các chữ a và d thường bằng chữ A và D hoa trong tệp văn bản, hãy chạy:

Mã nguồn [Chọn]
tr 'a,d' 'A,D' < example.txt

Hãy nhớ rằng tr hoạt động trên các ký tự chứ không phải chuỗi hoặc từ, do đó nó phù hợp nhất với việc thay thế các ký tự đơn giản hơn là các mẫu phức tạp hơn.

Bạn cũng có thể dọn sạch khoảng trắng hoặc chuẩn hóa cách kết thúc dòng bằng cách chạy lệnh sau:

Mã nguồn [Chọn]
cat messy_file.txt | tr 'r' 'n' > clean_file.txt
Thao tác này chuyển đổi các ký tự kết thúc dòng theo kiểu Windows (rn) thành các ký tự kết thúc dòng theo kiểu Unix (n), rất hữu ích khi làm việc với các tệp trên nhiều hệ điều hành khác nhau.

7. Sử dụng perl

Perl, một ngôn ngữ lập trình cấp cao, cũng có thể được sử dụng trực tiếp trong terminal để tìm và thay thế văn bản, khiến nó trở thành một sự thay thế tuyệt vời cho sed. Cú pháp của nó tương tự như sed, nhưng cung cấp nhiều tính năng nâng cao hơn.

Cá nhân tôi thực sự thích Perl vì khả năng biểu thức chính quy đặc biệt mạnh mẽ của nó, khiến nó trở thành lựa chọn tuyệt vời cho các hoạt động tìm và thay thế phức tạp.

Bạn có thể thay thế bất kỳ từ nào trong tệp bằng lệnh này:

Mã nguồn [Chọn]
perl -pi -e 's/Linux/Windows/g' file.txt
Ở đây, cờ -pi yêu cầu perl chỉnh sửa tệp tại chỗ và cờ -e cho phép bạn truyền trực tiếp biểu thức. Lệnh này sửa đổi file.txt bằng cách thay thế "Linux" bằng "Windows" trong toàn bộ tệp.

Đối với các phép thay thế đơn giản, các công cụ dòng lệnh như sed, awk hoặc perl hoạt động tốt. Chọn tập lệnh Bash hoặc Python nếu bạn cần thực hiện phép thay thế phức tạp hơn trên nhiều tệp hoặc với logic bổ sung.