내 모든 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
다음 줄에서 교체를 수행합니다.w
및q
/또는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=""}