2011-01-28 6 views
3

간단한 텍스트 대체를 사용하여 다른 사람이 기호 하나의 이름을 바꾼 소스 파일이 있다고 가정 해보십시오. 이 파일의 diff 출력은 일반적으로 매우 길며 일어난 일의 매우 유용한 식별자가 아닙니다. 변경 사항이 단순히 s/a/b/g이고, 그렇다면 무엇이 ab인지 알기를 원합니다.이 도구를 미리 알려주지는 않을 것입니다. (여기서 'a'와 'b'는 줄 바꿈을 포함하지 않는다고 가정 할 수 있습니다.)파일에서 검색 작업 바꾸기

  • 검색을 지정하고 바꾸는 데 사용할 알고리즘은 무엇입니까? (쉬운)
  • 몇 가지 텍스트 대체가 발생하면 어떻게 작동합니까? (상당히 쉽다)
  • 원본 파일을 비교하지 않고서 어떻게 diff 출력에서 ​​작동하도록 작성하겠습니까? (다소 힘들어 짐)
  • 예. 검색/바꾸기보다는 정규식 검색을 식별합니까? (하드)
  • 다른 사람과 함께 이러한 종류의 변경 사항이 포함 된 파일에서 sed 표현식과 많은 단축 된 diff를 생성하는 경험적 방법을 생각해 낼 수 있습니까? (하드)

이것은 알고리즘 설계와 비슷하지만 느슨하게 사용하고자하는 실제 도구를 기반으로하는 사용자를위한 질문이므로 좋은 명령 행 도구에 대해 알고 싶다면 위의 보너스 포인트 중 하나를 수행합니다. ;) 내가 지금 생각

+0

정규식에 대해 이야기 할 때 원래 문자열의 일부가 대체 문자열에 재사용 될 수 있습니까? 이것은 정규 표현식에 의한 단순한 검색보다는 일을 상당히 어렵게 만든다고 생각합니다. 그러나 상수 연산으로 대체하십시오 (아마도 목록에 두 개의 다른 항목을 쓸 수 있습니다). –

+0

그냥 좀 더 생각해 보았습니다. 순서가 중요하기 때문에 여러 텍스트 대체가 쉽지는 않습니다 :'s/program/executable' 다음에 오는's/programmer/developer'는'programmer'에 다르게 영향을줍니다. 작업이 전체 단어 (프로그래밍 언어의 토큰)에만 영향을 미쳤다고 가정 할 수 있습니까? –

+0

나는 단순한 경우조차도 당신의 상태가 한계가있는 한 이것을 해결하게되어 기쁩니다. 나는 일반적인 경우에 정규 표현식을 발견하는 것이 가능하다고 생각하지 않으며, 검색 - 치환 쌍을 겹쳐 쓰면 합리적인 알고리즘이 실제로 사용 된 저자와 다른 검색/대체 집합을 만들 것이라고 의심한다. 그러나 현재로서는 해결책이 없다는 점을 감안할 때, 부분적인 대답조차도 전혀없는 것보다 낫습니다. 그래서 가정에 당신의 가정을 설명하고 거기에서 나가십시오. – ijw

답변

1

두 가지 옵션 :

  • 실행 /s/b/a/g하고 분명
  • 자신은 diff 도구를 확인하십시오) 당신의 정규식에서 오류를 발견하지 않지만 (파일을 diff를, ​​그 작동 다른 것과 동일하지만 차이점을 표시하지 않고 특정 변경 사항을 허용합니다 (예 : 한 줄이 다른 경우 그 줄은 한쪽에만 a, 다른 한 줄에는 b).
+0

아,하지만 임의적 인 변경을 의미했는데, 당신이 도구를 실행하고 있다는 것을 모르는 시점입니다. 이를 반영하도록 질문이 업데이트되었습니다. – ijw

1

Darcs (distributed version control system)에는 이러한 변경에 대한 특별한 처리가 있으므로 알고리즘이 있습니다. 그래서 그들의 문서를 보거나 질문 해보십시오. 알고리즘을 재사용하는 것은 다소 어렵습니다. Haskell에 작성 되었기 때문입니다.

+0

문서를 가장 빨리 다룰 수있는 가장 빠른 방법은 replace를 수행하는 특수한 replace 명령과 replace를 수행 한 플래그 (http://darcs.net/manual/Best_practices.html#SECTION00514000000000000000)를 사용하는 것입니다. 그것의 효과로부터. 나는 여기에서 틀릴지도 모른다, 마음. – ijw