![sed 命令中那些特殊字符的用途是什么?](https://linux22.com/image/58112/sed%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E9%82%A3%E4%BA%9B%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E7%9A%84%E7%94%A8%E9%80%94%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%20.png)
我发现这个 bash 命令可以在控制台窗口中创建目录树。我发现它非常有用,但我不太明白所有特殊字符是如何工作的。有人可以帮我打破它吗?
alias tree="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'"
前两个非常容易理解,这是在 bash 中创建一个别名,递归列出当前目录下的文件和文件夹。
1. alias tree=""
2. ls -R
但在那之后我几乎迷失了。我知道它通过 grep 和 sed 传输其余命令,但我不明白其余部分,甚至不明白这些修饰符的名称。
答案1
alias tree="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'"
ls -R
: 递归列出子目录grep ":$"
: grep 仅适用于:
行尾带有 的行sed -e 's/:$//'
: 删除:
行尾-e 's/[^-][^\/]*\//--/g'
:将除最后一个目录之外的所有路径组件替换为--
.准确地说,替换任何 char except of ,-
后跟任何 char except of/
重复零次或多次,然后后跟/
。-e 's/^/ /'
: 在行首添加3个空格-e 's/-/|/'
: 首先替换-
为|
从解析命令开始,此代码片段存在许多“问题” ls
,但抛开这一点,您可以sed
以更紧凑的方式重写部分:
ls -R | grep ":$" | sed -e 's/:$//;s/[^-][^\/]*\//--/g;s/^/ /;s/-/|/'