쉘에서 여러 줄 교체

쉘에서 여러 줄 교체

내 텍스트 파일에 다음 텍스트 블록이 있습니다.

* Exported from Foo *

Title and Section

그리고 또 다른

* Exported from Foo *

Other Title and Other Section

로 교체해야 해요

# Title and Section

그리고

# Other Title and Other Section

이제 다음과 같이 할 수 있습니다.

echo "$(grep -A 2 "Exported from Foo" ../tmp/data/${nospacefile} | grep -v "Exported from Foo" | grep -v -- -- | tr -d '\r' | grep -v -e '^[[:space:]]*$' | sed -e 's/^[ \t]*//')" | while read -r title; do sed -i -e "s/^\([[:blank:]]*\)$title/\# $title/g" ../tmp/data/${nospacefile}; done

그러나 "제목 및 섹션" 또는 "다른 제목 및 기타 섹션"이라는 문자열도 바꾸고 싶지 않은 위치에 나타납니다. 내보내기 라인과 빈 라인 뒤에 나타날 때만 교체되기를 원합니다.

이 작업을 수행하는 데 가장 적합한 쉘 구조는 무엇입니까? Perl, Python 등으로 표준 출력을 보내는 것이 매우 기쁩니다.

답변1

두 번째 줄이 비어 있는지 여부에 관계없이 ed(1)세 번째 줄부터 편집을 시작해 볼 수 있습니다.* Exported from Foo *

stdoutsed 처럼 출력을 인쇄하세요 .

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' ,p Q | ed -s file.txt 

stdout이는 파일의 내부 편집을 위해 출력을 에 인쇄합니다 .

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' w | ed -s file.txt 

ed출력만 인쇄하는 스크립트를 사용하세요 .stdout

cat script.ed

산출

g/^\* Exported from Foo \*$/+2s/^/# /
,p
Q

파일을 편집하는 스크립트in-place

g/^\* Exported from Foo \*$/+2s/^/# /
w
q

이제 당신은 할 수 있습니다

ed -s file.txt < script.ed

관련 정보