Sed 如何自动创建目录树列表的README.md标记

Sed 如何自动创建目录树列表的README.md标记,sed,tree,directory,markdown,github-flavored-markdown,Sed,Tree,Directory,Markdown,Github Flavored Markdown,我想用目录树列表自动创建降价,以便在每个目录中显示在像GitHub这样的在线repo中 因此,考虑到我将使用可通过brew安装树安装在MacOS X上的(有关详细信息,请参阅),我提出了以下解决方案: tree --dirsfirst --noreport -I README.md > README.md;sed -i '' '1s/^/```/' README.md;echo \ >> README.md; sed -i '' -e '$s/$/```/' README.md

我想用目录树列表自动创建降价,以便在每个目录中显示在像GitHub这样的在线repo中

因此,考虑到我将使用可通过
brew安装树安装在MacOS X上的(有关详细信息,请参阅),我提出了以下解决方案:

tree --dirsfirst --noreport -I README.md > README.md;sed -i '' '1s/^/```/' README.md;echo \ >> README.md; sed -i '' -e '$s/$/```/' README.md
其中第一个
sed-i''1s/^/`/`/'README.md
`
字符前面–有关支持的标记的详细信息,请参阅

echo
echo\>>README.md正在添加换行符。这里请注意,我没有使用等效的
sed
文件名
sed-I'-e'$a\'filename
,因为这只会在由于
$a
模式而不存在时添加新行(请参阅)

而最后一个
sed-i'-e'$s/$/`/`README.md
正在向文件中添加一个尾部
`

tree
命令
tree--dirsfirst--noreport-I README.md
将排除一些模式,将目录放在第一位,忽略报告文件和目录计数

结果如下所示:

```.
├── bin
│   ├── Debug
│   │   ├── SampleLibrary.jar
│   │   ├── cooper.jar
│   │   ├── sugar.data.jar
│   │   ├── sugar.jar
│   │   └── swift.jar
│   └── Release
│       ├── SampleLibrary.jar
│       ├── cooper.jar
│       ├── sugar.data.jar
│       ├── sugar.jar
│       └── swift.jar
├── obj
│   ├── Debug
│   │   └── Android
│   │       ├── ClassLibrary2.elements.FilesWrittenAbsolute.txt
│   │       └── samplelibrary.jar
│   └── Release
│       └── Android
│           ├── ClassLibrary2.elements.FilesWrittenAbsolute.txt
│           └── samplelibrary.jar
├── ClassLibrary2.elements
└── ClassLibrary2.elements.user
 ```
您可以看到这个markdown README.md

此解决方案效率不高,仅限于
树的
-I
模式选项来过滤不需要的目录(比如构建目录)或文件名等。此外,更新现有的
README.md
标记也无法正常工作


该解决方案应适用于MacOS X(其中sed与Linux上的有所不同)。

获取源代码标记的一种方法是将所有内容缩进四个空格:

tree --dirsfirst --noreport -I README.md | sed 's/^/    /' > README.md
要按您的方式进行,请在每行添加一个新的第一行和最后一行,每个行上都有
`
,我们可以这样做

tree --dirsfirst --noreport -I README.md |
sed '1s/^/```'$'\n''/;$s/$/'$'\n''```/' > README.md
其中,在替换字符串中插入换行符是通过C样式转义完成的。或者,我们可以使用
“$(printf'\n')”

这两者都应该与macOS上的sed一起工作

有了GNU sed,情况会简单一些:

tree --dirsfirst --noreport -I README.md |
sed '1s/^/```\n/;$s/$/\n```/' > README.md
看看(我是作者)

它动态生成描述性目录树,并具有如下标记导出格式:

```.
├── bin
│   ├── Debug
│   │   ├── SampleLibrary.jar
│   │   ├── cooper.jar
│   │   ├── sugar.data.jar
│   │   ├── sugar.jar
│   │   └── swift.jar
│   └── Release
│       ├── SampleLibrary.jar
│       ├── cooper.jar
│       ├── sugar.data.jar
│       ├── sugar.jar
│       └── swift.jar
├── obj
│   ├── Debug
│   │   └── Android
│   │       ├── ClassLibrary2.elements.FilesWrittenAbsolute.txt
│   │       └── samplelibrary.jar
│   └── Release
│       └── Android
│           ├── ClassLibrary2.elements.FilesWrittenAbsolute.txt
│           └── samplelibrary.jar
├── ClassLibrary2.elements
└── ClassLibrary2.elements.user
 ```

├── 
示例文件夹\

│   ├── 
第一个子文件夹\
文档化文件夹
│   │   ├── 
sub-sub1\

│   │   │   └── 文件3.sh
这是文件3
│   │   ├── 
sub-sub2\

│   │   │   └── 文件4.cpp
这是文件4
│   │   └── random_file.rdm
文件化文件
│   ├── 
第二个子文件夹\
\u文件化文件夹
│   ├── 文本文件.txt
文本文件
│   ├── my_javascript.js
这是文件1
│   └── test.py
python脚本
└── README.md
主自述文件\

当然还有ASCII码

.
├── example_folder\
│   ├── first_subfolder\ (a documented folder)
│   │   ├── sub-sub1\
│   │   │   └── file3.sh (this is file 3)
│   │   ├── sub-sub2\
│   │   │   └── file4.cpp (this is file 4)
│   │   └── random_file.rdm (a documented file)
│   ├── second_subfolder\ (a documented folder with no documented files)
│   ├── a_text_file.txt (a text file)
│   ├── my_javascript.js (this is file 1)
│   └── test.py (a python script)
└── README.md (The main readme)

为什么要费事进行后处理以获取括号中的标记?为什么不前后呼应一下呢<代码>{echo'``;tree…;echo'`;}>README.md
?使用带有4个空格的制表符是一种替代解决方案,至少可以在Github标记上工作。在
MacOS X
上,我们应该使用
-i'
使其工作。@loretoparisi我认为不需要
-i'
,因为我们没有在适当的位置工作
README.md
由于重定向而被截断,而sed只从管道读取输入并写入先前截断的文件。