다양한 헤더가 포함된 Markdown 파일이 있고 저장소에 푸시할 때마다 섹션 중 하나를 수정하는 CI 스크립트를 작성하고 있습니다. 내 README.md는 다음과 같습니다.
읽어보기.md
# Title
....some text...
## Heading 1
...some text...
## Heading 2
...some text....
## Structure
<pre>
┬
├ first-dir
┬ first-sub-dir
├ second-dir
┬ second-sub-dir-1
├ second-sub-dir-2
</pre>
## Heading 3
...some text....
Structure
sed를 사용하여 명령 출력의 일부를 수정하고 싶습니다 . tree -d -L 2 -n
나는 사용하려고
var=$(tree -d -L 2 -n)
sed -i -E "s/## Structure\n<pre>\n(.|\n)*?<\/pre>/## Structure\n<pre>\n ${var} \n<\/pre>/g" README.md
하지만 제대로 작동하지 않습니다. 명령 대체에 대해 읽었 sed
지만 제대로 이해할 수 없습니다. 이에 대한 도움이 있거나 sed
도움 awk
이 될 것입니다.
답변1
awk '
/^<\/pre>$/ {flag=0}
/^## Structure$/ {print; getline; print
system("tree -d -L 2 -n")
flag=1}
!flag' <<<$(<file) >file
<<<$(<file) >file
- 사용자 정의 버퍼(일부 쉘에서는 사용할 수 없음) 임시 파일로 대체할 수 있습니다.file >tmp
좀 더 복잡한 방법으로 예를 들어보겠습니다.
sed -i '/^## Structure/!b
N;h
:1;N
/<\/pre>$/!b1
s/.*\n//
x;p
s/.*/tree -d -L 2 -n/e
G' file
/^## Structure/!b
- 스크립트는 패턴과 일치하지 않는 모든 줄을 무시합니다. 그리고 디스플레이는 변경되지 않습니다. 패턴이 발견되면 다음 스크립트가 실행되기 시작합니다.
N
- 패턴 공간(작업 버퍼)에 다음 입력 줄을 추가합니다. 결과적으로 ## Structure\n<pre>
h
패턴 공간을 저장 공간(백업 버퍼)에 복사하게 되었습니다.
:1
- 점프 표시를 만드세요.
N
-다음 줄을 추가합니다. 작업 버퍼에 들어갑니다. ## Structure\n<pre>\n┬
/<\/pre>$/!b1
작업 버퍼의 줄 끝이 패턴과 일치하지 않으면 레이블을 반환 하고 줄이 추가될 :1
때까지 루프에 매번 다음 줄을 추가합니다 . - 그런 다음 마지막 줄을 제외하고 작업 버퍼의 모든 내용을 삭제합니다 . - 작업 버퍼에 라인이 나타나도록 버퍼의 내용을 변경합니다 . 그리고 대체 버퍼에는 작업 버퍼의 내용을 인쇄하는 줄이 있습니다 . 버퍼의 내용을 셸 명령으로 바꾸고 실행합니다. - 대체 버퍼의 내용을 작업 버퍼에 추가합니다. - 출력 셸 명령에 추가합니다. 내용이 인쇄되고 작업이 스크립트의 시작 부분으로 돌아갑니다. 그 다음 줄은 작업 버퍼로 읽혀집니다. 그리고 파일에 패턴과 일치하는 줄이 더 이상 없기 때문에 나머지 줄도 첫 번째 줄과 마찬가지로 변경되지 않은 채 나타납니다.</pre>
s/.*\n//
</pre>
x
## Structure\n<pre>
</pre>
p
## Structure\n<pre>
s/.*/tree -d -L 2 -n/e
G
</pre>
</pre>
/^## Structure/!b