격리된 블록을 bash의 명령 출력으로 교체

격리된 블록을 bash의 명령 출력으로 교체

"울타리" 텍스트 블록을 Linux(특히 make 파일)의 tree 명령 출력으로 바꾸려고 합니다. 이것은 내 입력 파일입니다.

some text...
[fencetitle]
----
.
├── file1.txt
└── test
    └── file2.txt

1 directory, 2 files
----
some more text...

tree내용을 명령의 출력으로 바꾸고 싶습니다 .

some text...
[fencetitle]
----
.
├── file1.txt
├── newfile.txt
└── test
    └── file2.txt

1 directory, 3 files
----
some more text...

[fencedtitle]sed 명령을 사용하면 개행 문자를 line 및 to와 ----일치시킬 수 없는 것 같습니다 ----. 그러나 다음을 [fencedtitle]사용하여 중간에 텍스트를 바꿀 수 있습니다.----

sed -n '/\[fencedtitle\]/{:a;N;/----/!ba;N;s/.*\n/REPLACEMENT\n/};p' file

하지만 REPLACMENT를 tree 명령의 출력으로 바꿀 수는 없는 것 같습니다. 이것이 sed올바른 접근 방식입니까, 아니면 더 적절한 또 다른 접근 방식이 있습니까?

답변1

다음과 같이 시도해 볼 수 있습니다.

sed -n "/\[fencedtitle\]/{:a;N;/----/!ba;N;s/.*\n/$(tree)\n/};p" file

그러나 출력에 tree정규식에 고유한 문자가 포함되어 있으면 문제가 발생할 수 있습니다. 출력을 tree파일에 저장하는 경우:

tree > my-out

그러면 큰 문제 없이 sed에서 읽을 수 있습니다.

sed -n '/\[fencetitle\]/{p;n;p;r my-out
:a;n;/^----$/!ba};p' file

(예, r명령 뒤에 개행 문자가 필요합니다. 같은 줄에 어떤 명령도 뒤에 올 수 없습니다.)

펜스의 시작 부분 만 p;n;p;인쇄한 다음 파일을 읽은 다음 펜스 끝까지 모든 것을 건너뜁니다.

r나머지 부분을 별도의 sed 표현식으로 분할하여 명령 다음에 줄을 끝낼 수 있습니다 .

sed -ne '/\[fencetitle\]/{p;n;p;r my-out' -e ':a;n;/^----$/!ba};p' file

답변2

아래 방법에 따라 위의 예제를 완성했습니다.

sed "s/file1.txt/&\n|__newfile/g" example.txt

산출

some text...
[fencetitle]
----
.
├── file1.txt
|__newfile
└── test
    └── file2.txt

관련 정보