「フェンス」テキストブロックを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