0

多数のファイルを検索する小さなユーティリティがあります。Google と Windows の両方のデスクトップ検索でファイル内の適切な行が見つからなかったため、作成する必要がありました。検索は問題なく動作します (改善したいと思っています) が、util に追加したい機能の 1 つは、バッチ検索/置換です。

では、ファイルから行を読み取り、それを検索用語と比較し、合格した場合は行を更新し、ファイルの残りの部分を続行するにはどうすればよいでしょうか?

4

2 に答える 2

2

各ファイルに対して次のことを行います。

  • 通常どおり検索を実行します。また、置き換えるトークンを確認します。確認したらすぐに、そのファイルをもう一度開始します。置き換えるトークンが表示されない場合は、完了です。
  • もう一度開始するときは、新しいファイルを作成し、入力ファイルから読み取った各行をコピーして、必要に応じて置き換えます。
  • ファイルの処理が完了したら:
    • 現在のファイルをバックアップ ファイル名に移動する
    • 新しいファイルを元のファイル名に移動します
    • バックアップファイルを削除する

ただし、バイナリ ファイルなどではこれを行わないように注意してください。バイナリ ファイルでテキストの検索と置換を行うと、通常、悲惨な結果になります。

于 2008-12-04T21:14:31.803 に答える
0

PowerShell がオプションの場合、以下に定義されている関数を使用して、複数のファイルの検索と置換を実行できます。たとえば'a string'、現在のディレクトリ内のテキスト ファイルを検索するには、次のようにします。

dir *.txt | FindReplace 'a string'

別の値に置き換える'a string'には、最後に新しい値を追加します。

dir *.txt | FindReplace 'a string' 'replacement string'

を使用して、単一のファイルで呼び出すこともできますFindReplace -path MyFile.txt 'a string'

function FindReplace( [string]$search, [string]$replace, [string[]]$path ) {
  # Include paths from pipeline input.
  $path += @($input)

  # Find all matches in the specified files.
  $matches = Select-String -path $path -pattern $search -simpleMatch

  # If replacement value was given, perform replacements.
  if( $replace ) {
    # Group matches by file path.
    $matches | group -property Path | % {
      $content = Get-Content $_.Name

      # Replace all matching lines in current file.
      foreach( $match in $_.Group ) {
        $index = $match.LineNumber - 1
        $line = $content[$index]
        $updatedLine = $line -replace $search,$replace
        $content[$index] = $updatedLine

        # Update match with new line value.
        $match | Add-Member NoteProperty UpdatedLine $updatedLine
      }

      # Update file content.
      Set-Content $_.Name $content
    }
  }

  # Return matches.
  $matches
}

Select-String正規表現の一致もサポートしていますが、簡単にするために単純な一致に制限されていることに注意してください;)ファイルを新しいコンテンツで上書きするだけでなく、Jonが提案したようなより堅牢な置換を実行することもできます.

于 2008-12-07T15:13:19.940 に答える