Skip to content

Linux レシピ:文字列置換#

ファイル内の文字列を置換する処理#

sed -i 's/古い文字列/新しい文字列/g' ファイル名

同じ処理を poershell で実行する方法

(Get-Content -Path 'ファイル名') -replace '古い文字列', '新しい文字列' | Set-Content -Path 'ファイル名'

Warning

  • 実行前に test 要にファイルをコピーして、まずは試してみること
  • また、本番用のファイルはバックアップを取得しておくこと

フォルダ内のすべてのファイルに対し、文字列置換処理#

特定のフォルダ内にあるすべてのファイルの中から特定の文字列を置換するには、find コマンドとsed コマンドを組み合わせて使用することができます。 以下のような形でコマンドを実行します。

構文
find /path/to/folder -type f -exec sed -i 's/古い文字列/新しい文字列/g' {} +
  • 説明:
    • /path/to/folder: 置換を行いたい特定のフォルダのパスを指定します。
    • 古い文字列: 置換したい文字列を指定します。
    • 新しい文字列: 置換後の文字列を指定します。

このコマンドは、指定されたフォルダ内にある全てのファイルを探し、sed コマンドを使って古い文字列を新しい文字列に置換します。 -i オプションは sed コマンドをインプレースモードで実行するために使用され、ファイル内容を直接変更します。

Warning

作業前には 対象のディレクトリファイルを cp -r コマンドでバックアップを取っておくこと 置換前に正確にどのファイルが影響を受けるかを確認するために、まずは -i オプションを省略してコマンドを実行して、出力を確認することをおすすめします。

find /path/to/folder -type f -exec sed 's/古い文字列/新しい文字列/g' {} +
上記のコマンドは、フォルダ内の全てのファイルに対して置換を行います。フォルダ内の特定のファイルだけに対して置換を行いたい場合は、 find コマンドの適切なオプションを使用して対象を絞ることができます。

特定の拡張子がつくファイルに対する処理#

指定されたコマンドを特定の拡張子を持つファイルに適用するために、find コマンドを修正します。以下は、特定の拡張子(例: .txt)を持つファイルに対して sed コマンドを実行する例です。

find /path/to/folder -type f -name "*.txt" -exec sed -i 's/古い文字列/新しい文字列/g' {} +

上記の例では、-name "*.txt" の部分を適切な拡張子に変更してください。また、複数の拡張子を指定する場合は、-name オプションを複数回使用するか、 ワイルドカード * を使って一般的なパターンで指定することができます。

例えば、.txt と .csv 拡張子を持つファイルに対して処理する場合:

find /path/to/folder -type f \( -name "*.txt" -o -name "*.csv" \) -exec sed -i 's/古い文字列/新しい文字列/g' {} +

例1#

yaml ファイル内で指定した ディレクトリ名を置換

  • 対象箇所: templates_dir: '%CALLABLE{Protocol_test.testcases.OSPF.001.config.template_dir()}'

  • 対象文字列: %CALLABLE{Protocol_test.testcases

  • 置換後文字列: %CALLABLE{Basic_function_test.testcases

  • 置換コマンド:

    find ./ -type f -exec sed 's/%CALLABLE{Protocol_test.testcases/%CALLABLE{Basic_function_test.testcases/g' {} + 
    

  • 解説:

    • find ./ -type f: カレントディレクトリから下にある、ファイル(ディレクトリではないもの)を対象とする条件を指定しています。
    • -exec: find コマンドで見つかったファイルに対して実行するコマンドを指定するオプションです。
    • 's/古い文字列/新しい文字列/g' {} +:
    • find が見つけた各ファイルに対して実行する sed コマンドです。sed コマンドは、テキスト処理を行うためのユーティリティです。
    • s は置換を意味し、古い文字列 を 新しい文字列 に置換することを指定しています。g は置換を行う際に行内の全ての一致を対象とすることを示します。
    • {}: find が見つけたファイルのパスがこの部分に挿入されます。
    • +: 複数のファイルを 1 回のコマンドで処理することを示します。sed コマンドが複数のファイルを同時に処理する際に効率的です。

このコマンドは、指定されたパス以下にある全てのファイルを検索し、そのファイル内で指定された文字列の置換を行います。 ただし、注意が必要で、実行前にバックアップを取るなどしてデータの損失を防ぐようにしてください。 また、実際に実行する前に、sed コマンドが正しく動作するか確認するために、テスト用のファイルで試してみることをおすすめします。

同じ処理を poershell で実行する方法

Get-ChildItem -File -Recurse | ForEach-Object {(Get-Content $_.FullName) -replace '古い文字列', '新しい文字列' | Set-Content $_.FullName}
特定の拡張子がつくファイルに対する処理
$targetExtension = '.txt'; Get-ChildItem -File -Recurse -Filter *$targetExtension | ForEach-Object { (Get-Content $_.FullName) -replace '古い文字列', '新しい文字列' | Set-Content $_.FullName }