텍스트 파일에 다음과 같은 텍스트 덩어리가 있습니다.
* 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 등 무엇이든 stdout을 보내는 것이 매우 기쁩니다.
답변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