unix 使用sed和find命令的树功能

x6h2sr28  于 2022-12-23  发布在  Unix
关注(0)|答案(1)|浏览(184)
find . -type d -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'

在www.example.com上看到这个命令行unix.com,它在unix中充当树命令。我想有人解释一下sed命令到底在做什么。我无法理解语法
现在我知道了基本的sed命令语法,还在摸索unix环境。
PS:命令工作完美,讨论在该论坛关闭.

fjnneemd

fjnneemd1#

find命令只是查找目录并打印它们。
sed命令如下:

sed -e 's;[^/]*/;|____;g;s;____|; |;g'
        ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^
         |               |
         |               replace ____| with  |
         replace everything up to the last / with ____

让我们一步一步地看一下命令的执行过程:
查找所有目录并打印其名称:

$ find . -type d -print 
.
./python
./python/mytest
./python/mytest2
./python/mytest2/bk
./python/mytest2/infiles
./bash
./bash/backup
./awk
./sed

将最后一个/之前的所有内容替换为____

  • sed -e 's;[^/]*/;|____;g'的读取方式如下:
  • [^/]*--〉获取所有可能的与/不同的字符(*)。注意,^在这里代表否定。
  • /--〉匹配一个/
  • 给定该块,将其替换为字符串|____

请参见示例:

$ echo "hello/how/are/you" | sed 's;[^/]*/;;g'
you

$ echo "hello/how/are/you" | sed 's;[^/]*/;|____;g'
|____|____|____you

在这种情况下:

$ find . -type d -print | sed -e 's;[^/]*/;|____;g'
.
|____python
|____|____mytest
|____|____mytes2
|____|____|____bk
|____|____|____infiles
|____bash
|____|____backup
|____awk
|____sed

____|替换为|

$ find . -type d -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
.
|____python
| |____mytest
| |____mytest2
| | |____bk
| | |____infiles
|____bash
| |____backup
|____awk
|____sed

我们通常看到sed表达式如下:

sed 's/hello/bye/g'

但是如果你怀疑/可能有问题,你可以使用不同的分隔符。所以在这个例子中,分隔符是;

sed 's;hello;bye;g'

最后,请注意:

sed -e 's;[^/]*/;|____;g;s;____|; |;g'
        ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^
         1st command     2nd command

意味着两个命令将依次执行,因此它等效于:

sed 's;[^/]*/;|____;g' | sed 's;____|; |;g'

相关问题