用 bash 中命令的输出替换受隔离的块

用 bash 中命令的输出替换受隔离的块

我试图用 linux 中的 tree 命令的输出(特别是在 make 文件中)替换“围栏”文本块。这是我的输入文件:

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...

使用 sed 命令,我似乎无法将换行符与 line[fencedtitle]----to相匹配----。但是,我可以使用以下命令[fencedtitle]替换之间的文本:----

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

但我似乎无法用 tree 命令的输出替换 REPLACMENT 。这是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

相关内容