2013-06-05 1 views
1

상황은 다음과 같이이다 : 그것은 내 도구에 의해 처리되고 상징적 형태, 예를 들어, 변환됩니다원본 텍스트가 없을 때 diff를 인코딩하는 좋은 방법은 무엇입니까?

hello world! 

일부 텍스트가있다

[[email protected], [email protected]] 

(!이 삭제되는 방법에 유의하십시오).

이제 내 도구는 원본 소스 텍스트에 there을 추가하는 것이 좋습니다. 내 도구는 텍스트 데이터를 다시 보낼 수 있으므로 델타를 일부 형식으로 인코딩하고 다시 보내는 것이 좋습니다. 여기 diff과 예입니다 :

1c1 
< hello world! 
--- 
> hello there world! 

는 그러나 문제는 (내가 더 이상 원래의 텍스트를 가지고 있지 않기 때문에 나는 고전은 diff 형식을 사용할 수 없습니다, 나는 내 모델에서 해당 텍스트를 정확하게 생성 할 수 없다는 것입니다 예 : !이 누락 되었기 때문에).

제 질문은 전체 라인을 모른 채 라인 중간에서 수정을 인코딩 할 수있는 표준 텍스트 포맷이 있습니까? 같은 뭔가 :

insert 'there ' at 1:6 

나는 diff 자체가 몇 가지 다른 가능한 출력 형식을 가지고 알아,하지만 나는 완전히 새로운 라인의 컨텐츠를 필요없이 라인의 중간에 일을 추가 할 수있는 사람을 발견 할 수 없었다.

답변

1

의 출력 형식 중 하나는 ed 스크립트이고 diff -e입니다. 이제 diff은 행 삭제 또는 행 삽입과 같은 행 지향 편집을 수행하는 ed 스크립트를 생성합니다.

하지만 반드시 diff을 사용해야하는 것은 아니므로 한 줄 내에서 삽입 및 대체를 수행하는 섬세한 ed 스크립트를 도구 출력으로 만들 수 있습니다.

Ed는 행 내에서 문자의 숫자 주소 지정을 지원하지 않지만 정규식 일치/바꾸기로 수행 할 수 있습니다.

s/\(.\{m-1\}\).\{n\}/\1rep/ 

여기 m-1n가 소수에 의해 대체된다

칼럼 m 텍스트 rep (1로부터 계산)에서 시작하는 N 개의 문자 시퀀스를 대체하기 위해이 명령을 사용할 수있다. m은 1 인 것을 일어나는 경우 단지

s/.\{n\}/&rep/ 

여러분의 프로그램은 물론, rep의 문자를 탈출 조심있다.

대한 편집은 다음과 같은 파일에 적용됩니다

$ cp file file.tmp      # operate in-place on file.tmp 
$ (cat diffs ; echo wq) | ed -q file.tmp # edits are in file "diffs" 
관련 문제