sed를 사용하여 여러 연속 줄을 하나로 바꾸십시오.

sed를 사용하여 여러 연속 줄을 하나로 바꾸십시오.

내 모든 Python 스크립트에서 연속된 두 줄을 바꾸고 싶습니다.

import matplotlib as mpl
mpl.style.use(mpl_plt_default_template)

이 줄을 사용하세요

plt.style.use(mpl_plt_default_template)

지금까지 나는 발견했다떠나다연속된 두 줄을 각 줄에 적용되는 표현식으로 바꾸지만, 두 줄을 한 줄로 완전히 바꾸는 방법은 보여주지 않습니다. 실패한 접근 방식과 관련하여 다음 sed 문자열을 적용했습니다.

sed '/import matplotlib as mpl$/N;//s/mpl.style.use(mpl_plt_default_template)/plt.style.use(mpl_plt_default_template)/g'

노트첫 번째 줄( import matplotlib as mpl)은 파일의 다른 곳에 나타날 수도 있습니다.그리고 변함없이 유지되어야 한다, 따라서 목표는 주어진 순서대로 두 행이 차례로 발생하는 경우에만 교체를 수행하는 것입니다.

편집 내용에는 다음과 같은 추가 범위가 포함됩니다 find.

find최종 목표는 다음과 유사한 파이프를 사용하여 - 명령을 통해 찾은 여러 텍스트 파일에서 이 두 줄을 바꾸는 것입니다.

find /path/to/dir/ -type f -exec sed 'old-lines/s/single-new-line' {} \;

시스템 세부정보:

운영 체제: 루분투 20.04 LTS

답변1

파일을 편집하려면 다음과 같은 스크립트 가능한 텍스트 편집기를 사용하십시오.에드또는전임자(둘 다 POSIX 편집자입니다). 구문은 매우 유사합니다.

printf '%s\n' '/^import matplotlib as mpl$/d' 's/mpl/plt' 'w' 'q' | ed -s file
printf '%s\n' '/^import matplotlib as mpl$/d' 's/mpl/plt' 'x' | ex file
  • printf '%s\n'편집기에 명령을 제공합니다.

  • /^import matplotlib as mpl$/d패턴과 일치하는 첫 번째 줄을 삭제합니다.

  • s/mpl/plt다음 줄에서 교체를 수행합니다.

  • wq/또는 x변경 사항을 저장합니다.

정말로 Sed를 원한다면,

sed '/^import matplotlib as mpl$/N; s/.*\nmpl/plt/' file

확장 문제를 해결하려면:

find /path/to/dir/ -type f -exec sh -c '
    printf "%s\n" "/^import matplotlib as mpl\$/d" "s/mpl/plt" "w" "q" |
    ed -s "$1"' sh {} \;

답변2

필요하지 않은 경우 작업 sed에 사용할 수 있습니다 .awk

awk '$0=="import matplotlib as mpl" {buf=$0; next}
     buf {if (/^mpl\.style\.use/) {sub(/^mpl/,"plt")} else {print buf}; buf=""} 1' inputfile
  • 정확한 읽기 라인을 만나면 import matplotlib as mpl이를 버퍼에 저장 buf하고 실행을 위해 다음 라인으로 점프합니다.
  • 버퍼 변수가 설정되고 현재 줄이 로 시작하는 경우 mpl.style.use현재 줄의 해당 부분을 바꾸고 plt.style.use버퍼 내용을 삭제합니다.
  • 버퍼 변수가 설정되었지만 현재 줄이 "두 번째 줄" 패턴과 일치하지 않으면 현재 줄이 인쇄되기 전에 버퍼 내용이 인쇄됩니다. 그런 다음 버퍼가 지워집니다.
  • 버퍼가 비어 있을 때 만나는 모든 라인에 대해 단순히 라인을 있는 그대로 인쇄합니다.

두 번째 행에 대해 더 정확한 일치가 필요한 경우 두 번째 규칙을 다음으로 변경하십시오.

buf {if ($0=="mpl.style.use(mpl_plt_default_template)" {sub(/^mpl/,"plt")} else {print buf}; buf=""}

관련 정보