sed에서 명령 대체 사용

sed에서 명령 대체 사용

다양한 헤더가 포함된 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....

Structuresed를 사용하여 명령 출력의 일부를 수정하고 싶습니다 . 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

관련 정보