我只是想知道使用不同的流编辑和文本处理/操作工具时是否有可能;例如 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