シェルスクリプトまたはLinuxを使用して現在のディレクトリにある複数のファイルの内容を見つけて置き換える方法は?

シェルスクリプトまたはLinuxを使用して現在のディレクトリにある複数のファイルの内容を見つけて置き換える方法は?

私の現在のフォルダ名には、次のdetails1ファイルのリストが含まれています。file1file2file3

例:(ここではこれだけを表示しました。file1他のファイルにも同じ内容が含まれていますfile1。)

file1:cat file1

 href="/de_hecklist/secry/GD/GD10/"

 href="/de_hecklist/secry/GT/GT1/"

私のクエリ:

現在のディレクトリ(たとえばfile1file2などfile3)で複数のファイルを検索して置き換える方法を使用して、各ファイルを開かずに一度に各ファイルを置き換える方法です。

私は以下を試しました。 (各ファイルを開くと適用されます)

:%s/de_hecklist/data/g

:%s/secry/send/g

現在のディレクトリに複数のファイルがある場合、例外出力は次のようになります。

href="/data/send/GD/GD10/"

href="/data/send/GT/GT1/"

答え1

この行が正しい出力を提供する場合

 sed -e 's/de_hecklist/data/g' -e 's/secry/send/g' file1

in-placeこれで内容を変更できます。-i

 sed -i -e 's/de_hecklist/data/g' -e 's/secry/send/g' file1

一致するすべてのファイルに対してこれを行うには、次のようにfile?します。

find . -name 'file?' -type f -exec sed -i -e 's/de_hecklist/data/g' -e 's/secry/send/g' {} \;

sedすべてのファイルをパラメータとして渡すこともできます。まず、すべてのフルパスファイル名を提供するコマンドを作成します。

find . -name 'file?' -type f

次に、次に追加しますsed

sed -i -e 's/de_hecklist/data/g' -e 's/secry/send/g' $(find . -name 'file?' -type f) 

答え2

この試み:

find -maxdepth 1 -type f -name "file?" -exec sed -i.bak -e 's/de_hecklist/data/g; s/secry/send/g' {} +

-name "file?"ファイルに一致するパターンに置き換えるか、完全に削除してすべてのファイルを編集できます。

サブディレクトリが入力されておらず、現在のディレクトリで一致するファイルのみが変更されることを示し-maxdepth 1ますfindfile?

-i.baksedファイルをバックアップするオプションがあります。バックアップが不要な場合は削除できます。また、この-i--in-place)オプションはGNUsed拡張であるため、POSIXと互換性がありませんが、Linuxを使用しているため問題ありません。

関連情報