如果将 cat 命令通过管道传输到另一个命令,如何阻止 cat 命令输出文件名?

如果将 cat 命令通过管道传输到另一个命令,如何阻止 cat 命令输出文件名?

我正在尝试学习正则表达式,因此我创建了一个包含一些字符的文件。当我使用 cat 命令并将其通过管道传递给带有参数的 rgrep 命令来过滤文本时,生成的输出为“filename:filtered_text”。

cat regex.txt | rgrep -E '^a'
regex.txt:a
regex.txt:aa
regex.txt:aaa
regex.txt:aaaa
regex.txt:aaaaa
regex.txt:aaaaaa
file:acpi
file:adduser.conf
file:aliases
file:aliases.db
file:alternatives
file:anacrontab
file:apache2
file:apg.conf
file:apm
file:apparmor
file:apparmor.d
file:apport
file:appstream.conf
file:apt
file:avahi

不仅如此,它还检查文件夹中的其他文件,如果它们与正则表达式匹配,它也会显示它们,即使我只通过管道传输单个文件。

如何获得仅包含传递给 cat 的文件内容的正常输出?

答案1

您需要将-h标志与 一起使用rgrep,因为它是rgrep打印文件名的标志。这个标志阻止了这个。

我只能猜测你为什么使用rgrep而不是简单的grepand cat。所以,首先,你不需要catgrep PATTERN FILE足够。第二rgrep相当于grep -r.这是该-r标志的grep作用:

-r, --递归 仅当符号链接位于命令行时,才以递归方式读取每个目录下的所有文件。 请注意,如果未给出文件操作数,grep 将搜索工作目录。 这相当于 -d 递归选项。

对于简单的解决方案,请尝试:

grep '^a' regex.txt

(目前尚不清楚这种模式为何要使用该-E开关。)

答案2

rgrep是一个快捷方式(在我的 ubuntu 18.04 上:一个脚本)grep -rman grep

   -r, --recursive
          Read  all  files  under  each directory, recursively,

事实上,使用cat是没有意义的,因为rgrep似乎忽略了它。

相关内容