如何组合 tee、sed 和 grep?

如何组合 tee、sed 和 grep?

我有一个命令,我将 重定向| tee >(sed $'s/\033[[][^A-Za-z]*[A-Za-z]//g' >> ~user/filepath/file.txt)teesed $'s/\033[[][^A-Za-z]*[A-Za-z]//g'删除不需要的颜色格式。之后 会将干净的结果sed附加到。到目前为止一切顺利...>>file.txt

现在我想排除某些行添加到文本文件中。我发现本文建议使用grep -v '^#'匹配-v以 # 开头的反向行'^#',并使用在空行上反向匹配grep -v '^$'

我的问题是...我怎样/在哪里| tee >(sed $'s/\033[[][^A-Za-z]*[A-Za-z]//g' >> ~user/filepath/file.txt)可以包含它| grep -v '^#' | grep -v '^$'

答案1

在您的原始代码中sed … >> ~user/filepath/file.txt,负责设置sed附加到文件的内容。您似乎知道这一点。

现在如果您希望的输出sed被过滤grep,然后被另一个过滤grep,然后才附加到文件中,那么您需要像这样的管道:

sed … | grep … | grep … >> ~user/filepath/file.txt

根据您发现的内容填写省略号。

就您而言,上述整个代码应该符合>()您使用的语法。最终的命令如下:

… | tee >(sed … | grep … | grep … >> ~user/filepath/file.txt)

greps 将影响写入文件的内容;它们不会影响打印到标准输出的内容tee(即可能打印到终端)。


sed单独使用可以删除包含模式的行。对于您的情况,sed命令将是:

sed $'s/\033[[][^A-Za-z]*[A-Za-z]//g; /^#/d; /^$/d;'

在里面使用它>()来代替你原来的sed命令。现在你不需要添加greps 了,sed因为sed它已经完成了它的工作。

答案2

的使用| tee在这里并不重要。所有过滤都发生在 内部>(...),其中包含一个完整的分离命令行恰好被限制在子 shell 中,但除此之外,它还具有独立于外部命令的语法元素,因此您可以只关注该部分并完全忽略“外部”管道。

(也就是说,不是只是一个普通的>重定向 ->(...)是一个单元;一个内联语法元素,它并行分支出另一个管道,而不是重定向当前的管道。)

因此您使用的命令只是:

sed $'s/\033[[][^A-Za-z]*[A-Za-z]//g' >> ~user/filepath/file.txt

过滤文本通常更有用删除格式代码,这样您就可以在“sed”之后、重定向之前插入“grep”过滤器:

sed $'etc' | grep -v '^#' | grep -v '^$' >> ~user/filepath/file.txt

(这两个过滤器可以合并为一个grep -E -v '^#|^$'。)

在原始命令行中,它看起来像这样:

... | tee >(sed | grep | grep >> ~user/filepath/file.txt)

相关内容