문제

여러 파일을 검색하는 작은 유틸리티가 있습니다.Google 및 Windows 데스크톱 검색 모두 파일에서 적절한 줄을 찾지 못했기 때문에 만들어야 했습니다.검색은 잘 작동하지만(개선할 의향이 있음) 내 유틸리티에 추가하고 싶은 것 중 하나는 일괄 찾기/바꾸기입니다.

그렇다면 파일에서 한 줄을 읽고 검색어와 비교하여 통과하면 줄을 업데이트하고 파일의 나머지 부분을 계속 진행하는 가장 좋은 방법은 무엇일까요?

도움이 되었습니까?

해결책

각 파일에 대해 다음을 수행합니다.

  • 평소처럼 검색을 수행하십시오. 또한 토큰을 교체 할 수 있습니다. 보자 마자 그 파일을 다시 시작하십시오. 교체 할 토큰이 보이지 않으면 끝났습니다.
  • 다시 시작하면 새 파일을 만들고 입력 파일에서 읽은 각 줄을 복사하여 교체 할 때 교체를 수행하십시오.
  • 파일을 완료했을 때 :
    • 현재 파일을 백업 파일 이름으로 이동하십시오
    • 새 파일을 원래 파일 이름으로 이동하십시오
    • 백업 파일을 삭제합니다

이진 파일 등에서이 작업을 수행하지 않도록주의하십시오. 텍스트 검색을 수행하고 이진 파일을 교체 한 결과는 일반적으로 심각합니다!

다른 팁

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 정규식 일치도 지원하지만 단순화를 위해 단순 일치로 제한되었습니다. ;) 다음과 같이 보다 강력한 대체를 수행할 수도 있습니다. 단순히 새 콘텐츠로 파일을 덮어쓰는 것이 아니라 제안됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top