分離ブロックを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

関連情報