파일에서 두 패턴 사이의 내용을 바꾸는 방법?


9

다음 형식의 파일이 있습니다.

<common>
fitnes=0
genetic=1
method=0
</common>
<inputs>
foo=bar
bar=foo
</inputs>
<limits>
balance=200.00
</limits>

그리고 사이에있는 모든 것을 삭제 <inputs>하고 </inputs>(패턴 자체 제외) 다른 파일의 내용으로 바꾸고 싶습니다 (예 :) foo.txt. 다시 말해서 다른 내용 foo=bar과 줄을 bar=foo바꾸고 다른 내용으로 바꿉니다.

아마 다음과 같이 여러 줄 일치삭제하는 방법과 비슷할 수 있습니다 .

:g/<inputs/,/inputs>/d

그러나 다른 파일의 내용을 삽입하기 위해 대체해야 할 내용이 확실하지 d않지만 일치하는 패턴을 유지하고 싶습니다.

비슷한 접근 방식은 html 태그의 내부 컨텐츠제거하는 것입니다.

:/<inputs>/norm vitd

하지만 파일의 내용을 어떻게 추가할지 모르겠습니다.

이상적으로는 하나의 라이너를 찾으려고합니다. 다른 스크립트의 일부이기 때문입니다.

어떻게하면 되나요?

답변:


10

대체는 패턴을 다음과 같은 표현식의 결과로 대체하는 데 사용될 수 있습니다.

:keeppatterns %s;<inputs>\zs\_.\{-}\ze</inputs>;\=insert(readfile('test.txt'), '')

보다 :help sub-replace-expression

참고 것을 keeppatterns방지는 substitute검색 기록 및 보존 "마지막 검색 패턴 레지스터"아무것도를 추가하는 명령 - 참조 :help "/. 그것은 불필요하게 명령 수정과 빔의 글로벌 상태를 수정하는 스크립트를 방지하기 위해 좋은 방법이다 keepalt, keepjumps, lockmarks, keepmarks,와 keeppatterns.


5

Gary의 대안은 다음과 같습니다.

:g/^<inputs>/+,/^<\/inputs>/-d|-r dummy

:r명령을 사용하여 파일 더미에서 데이터를 읽는 것보다 먼저 주어진 패턴에서 모든 것을 삭제 합니다. 이제 <input>/</input>패턴 사이의 라인에서 파일 이름을 추출해야하는 경우 조금 더 복잡해집니다.


4

이것은 적어도 유닉스 시스템에서 작동하는 것 같습니다.

:/<inputs>/+1,/<\/inputs>/-1!cat foo.txt

이는 사용 {range}!{filter}후 하나의 라인을 필터링하는 명령 <inputs>전에 하나 </inputs>외부 프로그램 내지 cat foo.txt. 이 경우 cat표준 입력을 무시하므로 원래 행이 삭제되고 파일의 내용으로 바뀝니다 foo.txt.

보다:

:help :range!
:help cmdline-ranges

2

매크로가 더 쉬운 방법이라고 생각합니다. 특히 같은 장소가 여러 곳이라면

  1. 이 두 파일 만 열어 두십시오.
  2. 이제 첫 번째 파일에서 qa,( a로 기록 이름)으로 기록을 시작 하십시오.
  3. 시작 패턴을 검색하고 아래 로을 누른 다음 Ctrl- 를 누르고 v끝 패턴을 검색하고 위로를 누릅니다 . 이제 삭제하려는 부분이 선택되었습니다. 삭제하십시오.
  4. ma( a표시 이름)을 사용하여 위치를 표시하고 파일을 저장하십시오.
  5. :b2명령으로 두 번째 파일로 이동 하여 시작 / 종료 기준에 따라 유사하게 부품을 선택합니다.
  6. 이 파일 a로 돌아가서 해당 지점으로 이동하십시오. 거기에 붙여 넣습니다 p.
  7. 종료 기준을 다시 검색하고 섹션을 교차하여 다시 적중하지 마십시오.
  8. 을 눌러 레코딩을 종료하십시오 q.
  9. 로 횟수를 반복하십시오 40@a.

1
제안에 감사드립니다. 괜찮지 만이 특정 경우에는 도움이되지 않습니다 ex. 사용자 입력 인수에 따라 삽입 할 파일을 지정할 수있는 스크립트의 일부로 비 대화 형 솔루션을 찾고 있기 때문 입니다.
kenorb

1

이것이 비 XML 도구로 XML을 구문 분석하려는 또 다른 시도 인 경우에는하지 마십시오.

여기의 해결책은 유효하지만 의도가 아닐 수도 있습니다. XML이 길 들여진 소스가 아닌 경우 태그에 이스케이프, CDATA 또는 공백이 생길 수 있습니다!

따라서 vi의 command에서 xsltproc가이를 처리 할 수 ​​있습니다.


이 파일은 실제로 적절한 XML 형식이 아니라 실제로 잘 문서화 아니에요 ini파일을 그 3 XML과 같은 태그를 가진.
kenorb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.