我有一个命令,我将 重定向| tee >(sed $'s/\033[[][^A-Za-z]*[A-Za-z]//g' >> ~user/filepath/file.txt)
到tee
,sed $'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)
grep
s 将影响写入文件的内容;它们不会影响打印到标准输出的内容tee
(即可能打印到终端)。
sed
单独使用可以删除包含模式的行。对于您的情况,sed
命令将是:
sed $'s/\033[[][^A-Za-z]*[A-Za-z]//g; /^#/d; /^$/d;'
在里面使用它>()
来代替你原来的sed
命令。现在你不需要添加grep
s 了,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)