複数のファイル内のテキストを検索して置換


84

リンクされたチュートリアルのNotepad ++のように、複数のファイルで特定のテキストを見つけて置き換える方法を知りたい。

例:http : //cybernetnews.com/find-replace-multiple-files/


グラフィカルインターフェイスはありませんが、sed(man sed)を調べることをお勧めします。UNIXの最初から存在していたのは、ストリームエディタです。
アポリンスキー

回答:


136

ここでは、sedを使用して、ディレクトリ/ home / user / directory /にある拡張子cを持つすべてのファイルで、「cybernetnews」という単語をすべて「cybernet」に置き換えます。

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

実行ディレクトリから再帰的に検索し、通常の読み取り可能、書き込み可能なファイルのみを操作する、より一般的なバリエーション:

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

2
これは非常に効率的な方法であるため、これに投票
サバコン

4
; sedのが最良の選択はIMOですが、あなたは答えのコンポーネントについて説明した場合の答えは、より便利になるので、最大投票(個人的に、私は{} \程度に精通し、好奇心はないよ)
セコイア・マクダウェル

5
@sequoiamcdowellウー!私はこれを見逃しました!ごめんなさい。中括弧は基本的に「各一致」を意味し、エスケープされたセミコロン(\;)は二重解析を防ぐためのものです。Bourne互換シェルとsedがコマンドを解析しようとするのは望ましくありません。sedだけです。

@Christopherは、単語に次のようなスペースが含まれている場合、どのように機能しcyber net newsますか?これをどのように変換できcyber netますか?
ルシッドアラム

1
:-eスイッチを使用して文字クラスを使用します@KhurshidAlamsed -i -e "s/cyber\snet\snews/cyber net/g"

27

ストリームエディターsedは、この種の作業の強力なユーティリティであり、最初の選択肢ですが、Ubuntuベースのネイティブアプリケーションを使用して通常のテキストエディターからこれを行う場合は、Jeditをご覧になることをお勧めします。 、リポジトリで利用可能で、コンソールに入力することでインストールできます。

sudo apt-get install jedit

jeditを起動し、検索メニュー項目をクリックして、メニューリストで[ディレクトリで検索]項目をクリックすると、以下のダイアログが表示されます。

Jedit Search In Folderダイアログ

これはNotepad ++のそれに似ており、同じことをします。これがあなたが望むものだと思います。


これは、コードの行全体を検索する場合に最適であり、で同じことをした場合、すべての正規表現特殊文字をエスケープするのをためらいましたsed
IQAndreas

コードブロック(html、javascriptなど)を数秒で置き換えることができます。
lepe 14年

これは、geanyがすべてのオカレンスを見つけるのに数分かかったのに対して、数時間後に1つの置換を行っていなかった多数のファイルでは機能しません。これは効率的な検索と置換ではないかもしれませんが、部屋を暖かく暖めてくれました。
マークアローニ

19

別のGUIオプションはregexxerです: regexxerスクリーンショット


完全に動作します(すでにRegexに精通している場合)、ありがとう。
アーネスト14

1
たとえ正規表現がわからない場合でも、このツールを単純な文字列検索および置換ツールとして使用できます。正規表現などは必要ありません。
モハドアブドゥルム

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

現在のフォルダー内のすべてのファイルで発生したoldtextをnewtextに置き換えます。ただし、バックスラッシュを使用して、oldtextおよびnewtext内のすべてのperl特殊文字をエスケープする必要があります。


9

Geanyで確認してください。これは、Linuxに最適なNPP代替品です。それを正確に行うことができ、さらに正規表現を使用できます。


Geanyが大好き!それは私のお気に入りのエディターであり、十分に強力です。
ピス

1
私が知る限り、Geany 1.23.1(Ubuntu 13.10にパッケージ化されています)では、正規表現を使用して複数のファイルを検索できますが、それらを置き換えることはできません。
ドリューノアケス

Geanyで複数のファイルをすべて開き、[検索/置換]ダイアログの[セッション中]ボタンを使用すると、検索して置換できます。
MV。

1
[メッセージ]タブにリストされている5000個のファイルをどのように開きますか?
マーク

1
わかりました、regexxerは私が求めていたものとほぼ同じでした。名前に正規表現が含まれていたため、以前にスキップしたばかりで、正規表現とは関係ないようにしているだけです。しかし、私は間違っていました。そのツールには、検索と置換に必要なものが正確に備わっています。
モハドアブドゥルム


2

このスクリプトを使用して、コードをコピーし、ファイルを作成できますfind_and_replace_in_files.sh

少し変更しました。ご意見をお聞かせください。

# *****************************************************************************************
# 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

別のプログラムはSearchmonkeyです。

SearchMonkeyは、面倒なfind / grepを、一致するテキストの位置と量を示すマークアップをすばやく提供する滑らかなユーザーインターフェイスに置き換えることを目的とした軽量のGtkアプリケーションです。目標は、エンドユーザーやソフトウェア開発者に、使いやすくアクセス可能な検索ツールを提供することです。


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

フェドラで私のために働く


あなたは、これは上の改善方法を説明する行追加することができますaskubuntu.com/a/84013/158442を
muru

@muru実行されるsedインスタンスははるかに少なくなります!そのため、CPU時間の点ではるかに高速です。ファイルのアクセス時間は制限されるため、クロック時間はそれほど速くないと思いますが、システムの負荷は低くなります。注xargsは、単一のsedコマンドのコマンドラインにファイル名のhunderedsなどをたくさん配置します-パスの長さに基づいて利用可能なバッファサイズを埋めます。
フォルカーシーゲル14

うーん...これが閉じられた場合、私はそれを、なぜそれが支持されたものよりも優れているのかを明確に説明するものに置き換えることができます。
フォルカーシーゲル14

で達成することができる@VolkerSiegel +の代わり\;find、右?
ムル14

1
@muruおそらく...私の「仕事にぴったりのツール」-本能は明らかに好むxargsが、あなたは正しい。From man find-exec command {} +:... The command line is built in much the same way that xargs...。私はのコマンドラインを思わせるgit filter-branch...;)
フォルカー・シーゲル

2

非常に簡単な解決策:すべてに置き換え*.txtたフォルダ内のファイルstring_1を持ちますstring_2

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

素晴らしい答えです!ほんの少し追加します。現在のディレクトリの任意のファイルの文字列を再帰的に置き換えたい場合は、次を試してくださいsed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
。– drugan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.