我试图用 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