sed 스크립트는 파일에서 마지막으로 일치하는 줄 뒤에 줄을 삽입합니다.

sed 스크립트는 파일에서 마지막으로 일치하는 줄 뒤에 줄을 삽입합니다.

파일의 모든 유사한 줄 다음에 파일에 줄을 삽입하는 스크립트를 sed에 작성하고 싶습니다. 그래서 마지막으로 나타나는 패턴을 찾아 바로 뒤에 삽입해야 합니다. 이는 파일의 마지막 줄이 아닐 가능성이 높습니다.

나는 sed에 대한 다중 파이프 호출을 사용하거나 tac과 같은 다른 도구를 사용하는 많은 솔루션을 보았습니다. 이들 중 어느 것도 적합하지 않습니다. 동일한 파일에 다른 변경 사항을 적용하는 더 큰 스크립트에 포함될 수 있는 순수한 sed 솔루션이 필요합니다.

나는 잠시 동안 검색해 왔지만 불가능하다고 생각합니다. 포기하기 전에 여기에 물어봐야겠다고 생각했어요!

구체적인 내용이 설명에 도움이 된다면 Apache http.conf 파일에서 마지막 "Include" 지시문을 찾아 마지막 지시문 아래에 다른 지시문을 삽입하고 싶습니다.

답변1

기술적으로 아래 스크립트는 (최소한의 테스트를 통해) 귀하가 요청한 작업을 수행하는 것 같습니다. 원칙은 보류 공간에 라인을 저장하는 것입니다. include라인이 발견되면 누적된 라인을 모두 인쇄하고 입력 끝에서 예약된 공간을 지우고 new누적된 라인에 추가하여 인쇄합니다.

#n
H
$ {
  g
  s/^/new/
  p
  b
}
/include/ {
  g
  s/^\n//
  p
  s/.*//
  h
  b
}

이는 기존 sed 스크립트에 잘 통합되지 않을 것입니다. 실제로 sed의 기능이 확장되었습니다.

Apache 구성 파일은 메모리에 쉽게 로드될 수 있습니다. 스트리밍 편집기를 사용하는 대신 Perl이나 Python과 같은 멋진 도구로 로드하거나 최소한 awk를 사용하세요.

답변2

실제 해결책이 있을 수 있고 sed다른 사람이 이에 동참할 수도 있지만, 저는 오래 전에 이 해킹으로 동일한 시나리오를 해결했습니다.

스크립트가 새 콘텐츠를 삽입하기를 원하는 위치의 구성 파일에 작은 주석 "마커"를 배치했습니다. 설명하다:

#(Insert includes here)

그런 다음 단순 검색을 사용하고 해당 문자열을 검색 매개변수로 바꾸고 이를 새 포함과 원래 주석 행으로 바꿀 수 있습니다.

관련 정보