Làm thế nào để lập trình chỉnh sửa một tập tin chỉ bằng thiết bị đầu cuối?


13

Tôi muốn viết một tập lệnh shell, theo đó tôi có thể đọc tệp từ lệnh và chỉnh sửa tệp mà không cần can thiệp thủ công (dựa trên tìm kiếm một số văn bản và thay thế nó bằng một văn bản khác).

Tôi không cần sử dụng bất kỳ trình soạn thảo văn bản nào cho việc này .... chỉ cần tìm kiếm văn bản (như sử dụng grep) và sau đó thay thế nó bằng một số văn bản khác và lưu các thay đổi ....

Câu trả lời:


10

Đó là nơi sedđến để chơi. Một sedlệnh có định dạng này:

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

Nó sử dụng regexes nên có thể / sẽ hơi khó khăn. Một số ví dụ cơ bản được lấy từ liên kết thứ 2 bên dưới:

# thay thế (tìm và thay thế) "foo" bằng "bar" trên mỗi dòng
sed 's / foo / bar /' # chỉ thay thế thể hiện thứ nhất trong một dòng
sed 's / foo / bar / 4' # chỉ thay thế phiên bản thứ 4 trong một dòng
sed 's / foo / bar / g' # thay thế TẤT CẢ các trường hợp trong một dòng
sed 's / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 /' # thay thế trường hợp tiếp theo
sed 's / \ (. * \) foo / \ 1bar /' # chỉ thay thế trường hợp cuối cùng

# thay thế "foo" bằng "thanh" CHỈ cho các dòng có chứa "baz"
sed '/ baz / s / foo / bar / g'

# thay thế "foo" bằng "bar" EXCEPT cho các dòng có chứa "baz"
sed '/ baz /! s / foo / bar / g'

# thay đổi "đỏ tươi" hoặc "hồng ngọc" hoặc "puce" thành "đỏ"
sed 's / Scarlet / red / g; s / ruby ​​/ red / g; s / puce / red / g' # most seds
gsed 's / Scarlet \ | ruby ​​\ | puce / red / g' # GNU sed

Một số tài liệu tham khảo


7

Câu trả lời rất muộn. Tuy nhiên, điều này có thể giúp những người khác có vấn đề / câu hỏi tương tự.

Tôi sẽ khuyên bạn nên tạo và áp dụng một bản vá. Một ví dụ đẹp có thể được tìm thấy ở đây .

Ví dụ: giả sử rằng tệp new.txt chứa các thay đổi mà bạn muốn áp dụng cho old.txt. Bạn có thể thực thi các lệnh trên một thiết bị đầu cuối hoặc bằng cách tạo và thực hiện một patch_file.sh.

Dòng lệnh: mở một thiết bị đầu cuối và sao chép và thực hiện các dòng bên dưới (thay đổi tên tệp nếu cần):

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

Script: sử dụng cách tiếp cận tệp .sh. Trong một thiết bị đầu cuối (bàn phím: ctrl + alt + t: gedit patch_file.sh

Sao chép và dán các lệnh sẽ đi trên thiết bị đầu cuối, vào tệp .sh và bên dưới tiêu đề như dưới đây (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

Làm cho tập lệnh thực thi (thiết bị đầu cuối):

chmod +x patch_file.sh

Chạy tập lệnh (thiết bị đầu cuối):

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

Bản vá +1 luôn là cách đơn giản để sửa đổi từ trung bình đến nặng hoặc phức tạp. Tôi không biết tại sao một số người cố gắng làm mọi thứ bằng các công cụ regex.
user.dz

+1 tốt hơn nhiều so với kỹ thuật đảo ngược một regex dường như áp dụng thay đổi bạn muốn trên tệp bạn kiểm tra ... nhưng khi áp dụng cho các phiên bản khác của tệp đó đôi khi có các hiệu ứng khác.
bigjosh

Liệu một bản vá có ý nghĩa nếu tôi muốn thay thế tất cả các phiên bản của chuỗi văn bản cụ thể, tức là thay thế tất cả "" bằng "_", tất cả "trừ" bằng "-" và tất cả "gb | <string_of_numbers> | ARO:" bằng " ARO: "? Cảm ơn.
Josh

1

Nếu bạn muốn chỉnh sửa tệp, hãy sử dụng trình chỉnh sửa tệp, có các trình chỉnh sửa tệp dựa trên lệnh có thể được sử dụng từ các tập lệnh, như ex hoặc ed .


1

Bạn đang tìm kiếm sed hoặc awk. Tôi thấy sed đơn giản hơn và mạnh mẽ hơn.

Đây là một ví dụ từ một câu hỏi khác .

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

Điều này có nghĩa là:

  • tìm kiếm trong tập tin /usr/share/applications/defaults.list
  • Tìm / grep gedit.desktop
  • Thay thế bằng yournew.desktop
  • Áp dụng các thay đổi tại chỗ -i

0

Tùy thuộc vào những gì bạn cần chỉnh sửa, nếu bạn quen thuộc vithì edcó thể hữu ích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.