내 텍스트 파일에 다음 텍스트 블록이 있습니다.
* 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 *
stdout
sed 처럼 출력을 인쇄하세요 .
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