流编辑工具:输出抓取的内容

流编辑工具:输出抓取的内容

我只是想知道使用不同的流编辑和文本处理/操作工具时是否有可能;例如 grep、cut、sed、awk、perl 等。是否有方法输出(以文件或 STDOUT 的形式)输出的逆值(换句话说,运行命令时未提取的内容)以通用方式,即与另一个应用程序一起使用,而不是使用工具功能和可选标志来完成它。

例如:

这将打印文件中与正则表达式匹配的行:

sed '/regexp/!d

这将打印文件中与正则表达式不匹配的行:

sed '/regexp/d'

是否可以仅运行这些命令中的一个,并且将不包含 STDOUT 的数据也输出到某处,而不使用 sed 的选项,而是使用一种通用方法,然后将其应用于 awk 或 grep 命令。

您可以做这样的事情,使用 conn 并将 sed 命令输出到文件,然后将原始文件与输出文件进行比较并输出差异。类似的东西(我也确信语法不正确,但我希望逻辑是可以实现的):

comm <(sort originalFile) <(sort sedProcessedFile) > originalFileMinussedProcessedFile

来源

但不仅适用于 sed,还适用于任何类型的文本/流操作工具,或者至少是 awk 和 perl。

答案1

对此没有通用方法。过滤器只是读取和写入流,它们不会就地修改流,并且它们之间的关系完全是任意的并且依赖于特定的工具。因此,通用机制无法知道某些内容已从输入中“删除”,从而将其保存以复制到输出中。

awk但是像和 之类的工具perl可以自行写入任意文件,因此它们可以使用显式代码来完成此操作:

awk '/regexp/ { print } !/regexp/ { print > "non-matching.txt" }' > matching.txt

相关内容