Tìm và thay thế văn bản trong nhiều tệp


84

Tôi muốn biết làm thế nào tôi có thể tìm và thay thế một văn bản cụ thể trong nhiều tệp như trong Notepad ++ trong hướng dẫn được liên kết.

ví dụ: http://cybernetnews.com/find-replace-mult Môn-files /


Nó sẽ không có giao diện đồ họa nhưng tôi mong bạn nên kiểm tra sed (man sed). Đây là trình soạn thảo luồng đã tồn tại từ khi bắt đầu UNIX.
apolinsky

Câu trả lời:


136

Ở đây tôi sử dụng sed để thay thế mọi lần xuất hiện của từ "cybernetnews" bằng "cybernet" trong mỗi tệp bằng phần mở rộng, c, trong thư mục, / home / user / thư mục /.

find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;

Một biến thể chung hơn trong đó bạn tìm kiếm đệ quy từ thư mục thực thi và chỉ hoạt động trên các tệp thông thường, có thể đọc, có thể ghi:

find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;

2
Bỏ phiếu cho điều này bởi vì đây là một phương pháp hiệu quả
Sabacon

4
Bỏ phiếu vì sed là IMO lựa chọn tốt nhất, nhưng câu trả lời sẽ hữu ích hơn nếu bạn giải thích các thành phần của câu trả lời (cá nhân tôi không quen và tò mò về {} \;)
sequoia mcdowell

5
@ resultoiamcdowell Woo! Tôi đã bỏ lỡ điều này! Lấy làm tiếc. Niềng răng về cơ bản có nghĩa là "cho mỗi trận đấu" và dấu chấm phẩy thoát (\;) là để ngăn chặn phân tích cú pháp kép. Chúng tôi không muốn lớp vỏ tương thích bourne và sed cố gắng phân tích lệnh, chỉ cần sed.

@Christopher nó hoạt động như thế nào nếu từ đó chứa khoảng trắng như thế cyber net newsnào? Làm thế nào tôi có thể chuyển đổi này để cyber net?
Khurshid Alam

1
@KhurshidAlam Sử dụng lớp ký tự với công tắc -e:sed -i -e "s/cyber\snet\snews/cyber net/g"

27

Trình chỉnh sửa luồng, sed, là một tiện ích mạnh mẽ cho loại công việc này và là lựa chọn đầu tiên của tôi, tuy nhiên, nếu bạn muốn làm điều này từ một trình soạn thảo văn bản thông thường bằng ứng dụng gốc dựa trên Ubuntu, tôi khuyên bạn nên xem Jedit , Nó có sẵn trong kho và có thể được cài đặt bằng cách gõ vào bảng điều khiển của bạn:

sudo apt-get install jedit

Bắt đầu jedit, nhấp vào mục menu tìm kiếm, trong danh sách menu, nhấp vào mục Tìm kiếm trong thư mục, bạn sẽ được trình bày với hộp thoại bên dưới:

Tìm kiếm Jedit trong hộp thoại thư mục

Điều này tương tự như của Notepad ++ và thực hiện điều tương tự, tôi tin rằng đây là những gì bạn muốn.


Điều này là hoàn hảo khi tôi đang tìm kiếm toàn bộ dòng mã, và do dự thoát khỏi mọi ký tự đặc biệt regex nếu tôi đã làm điều tương tự sed.
IQAndreas

bạn có thể thay thế các khối mã (như html, javascript, v.v.) trong vài giây.
Lepe

Điều này không hoạt động trên một số lượng lớn các tệp, sau một vài giờ, nó đã không thực hiện một lần thay thế, trong khi geany mất vài phút để tìm thấy tất cả các lần xuất hiện. Đây có thể không phải là một tìm kiếm hiệu quả và thay thế nhưng nó làm ấm căn phòng độc đáo.
Mark Aroni

19

Một tùy chọn GUI khác là regexxer : ảnh chụp màn hình regexxer


Hoạt động hoàn hảo (nếu bạn đã quen thuộc với Regex), cảm ơn bạn.
Ernest

1
Thậm chí, nếu bạn không biết regex, bạn có thể sử dụng công cụ này như một công cụ tìm kiếm và thay thế chuỗi đơn giản và nó sẽ thực hiện công việc cho bạn, không cần regex hay bất cứ điều gì.
Mohd Abdul Mujib

13
perl -pi -e 's/oldtext/newtext/g' *

thay thế bất kỳ sự xuất hiện của oldtext bằng newtext trong tất cả các tệp trong thư mục hiện tại. Tuy nhiên, bạn sẽ phải thoát tất cả các ký tự đặc biệt perl trong oldtext và newtext bằng cách sử dụng dấu gạch chéo ngược.


9

Kiểm tra với Geany , đây là sự thay thế NPP hoàn hảo cho Linux. Bạn có thể làm chính xác điều đó cộng với bạn có thể sử dụng regex.


Tôi yêu Geany! Đó là trình soạn thảo yêu thích của tôi và đủ mạnh.
Pisu

1
Theo như tôi có thể nói, Geany 1.23.1 (được đóng gói với Ubuntu 13.10) cho phép tìm kiếm nhiều tệp bằng regex, nhưng không thay thế trong đó.
Drew Noakes

Bạn có thể tìm kiếm và thay thế trong Geany nhiều tệp nếu bạn mở tất cả chúng và sau đó sử dụng nút "trong phiên" trong hộp thoại Tìm kiếm / Thay thế.
MV.

1
Làm thế nào để bạn mở 5000 tệp được liệt kê trong tab tin nhắn?
Mark Aroni

1
Ok, regexxer là khá nhiều những gì tôi đã yêu cầu, tôi đã bỏ qua nó trước đó vì tên của nó có regex và tôi chỉ có xu hướng tránh bất cứ điều gì để làm với regex. Nhưng tôi đã nhầm, công cụ đó có chính xác những gì cần thiết cho tìm kiếm và thay thế.
Mohd Abdul Mujib


2

Bạn có thể sử dụng tập lệnh này, sao chép mã và tạo một tập tin find_and_replace_in_files.sh.

Tôi đã sửa đổi nó một chút; xin vui lòng cho tôi biết ý kiến ​​của bạn.

# *****************************************************************************************
# find_and_replace_in_files.sh
# This script does a recursive, case sensitive directory search and replace of files
# To make a case insensitive search replace, use the -i switch in the grep call
# uses a startdirectory parameter so that you can run it outside of specified directory - else this script will modify itself!
# *****************************************************************************************

!/bin/bash
# **************** Change Variables Here ************
startdirectory="/your/start/directory"
searchterm="test"
replaceterm="test=ok!"
# **********************************************************

echo "***************************************************"
echo "* Search and Replace in Files Version 01-Aug-2012 *"
echo "***************************************************"

i=0; 

  for file in $(grep -l -R $searchterm $startdirectory)
    do
      cp $file $file.bak
      sed -e "s/$searchterm/$replaceterm/ig" $file > tempfile.tmp
      mv tempfile.tmp $file

    let i++;

      echo "Modified: " $file
    done

echo " *** All Done! *** Modified files:" $i

2

Một chương trình khác là Searchmonkey .

SearchMonkey là một ứng dụng Gtk nhẹ, nhằm mục đích thay thế find / grep rườm rà bằng giao diện người dùng bóng bẩy, nhanh chóng cung cấp một vị trí hiển thị đánh dấu và số lượng khớp văn bản. Mục tiêu là cung cấp một công cụ tìm kiếm đơn giản để sử dụng và có thể truy cập cho người dùng cuối và các nhà phát triển phần mềm.


2
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"

làm việc cho tôi trên fedora


Bạn có thể thêm một dòng giải thích cách cải thiện điều này qua Askubfox.com/a/84013/158442
muru

@muru Nó chạy ít hơn nhiều sedtrường hợp! Vì vậy, nó là nhanh hơn nhiều về thời gian CPU. Bởi vì thời gian truy cập tệp sẽ bị giới hạn, tôi nghĩ rằng thời gian đồng hồ không nhanh hơn nhiều, nhưng cho tải hệ thống thấp hơn. Lưu ý xargssẽ đặt rất nhiều, như hàng trăm tên tập tin vào dòng lệnh của một sedlệnh - điền kích thước bộ đệm có sẵn dựa trên độ dài của đường dẫn.
Volker Siegel

Hmm ... nếu điều này bị đóng lại, tôi có thể thay thế nó bằng một giải thích rõ ràng lý do tại sao nó tốt hơn so với cái được nâng cấp.
Volker Siegel

@VolkerSiegel có thể đạt được +thay vì \;trong find, phải không?
muru

1
@muru Có thể ... "Công cụ nghiêm ngặt cho công việc" của tôi rõ ràng là thích xargs, nhưng bạn đã đúng; từ man find: -exec command {} +: ... The command line is built in much the same way that xargs.... Làm cho tôi nghĩ về các dòng lệnh của git filter-branch...;)
Volker Siegel

2

Một giải pháp rất đơn giản: thay thế trong tất cả *.txtcác tệp trong thư mục string_1bằng string_2:

sed -i 's/string_1/string_2/g' *.txt

Câu trả lời chính xác! Chỉ cần một số bổ sung. Nếu bạn muốn thay thế một chuỗi trong bất kỳ tệp nào của thư mục hiện tại một cách đệ quy thì hãy thử điều này:sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
Drugan
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.