我正在尝试学习正则表达式,因此我创建了一个包含一些字符的文件。当我使用 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
而不是简单的grep
and cat
。所以,首先,你不需要cat
。grep PATTERN FILE
足够。第二rgrep
相当于grep -r
.这是该-r
标志的grep
作用:
-r, --递归 仅当符号链接位于命令行时,才以递归方式读取每个目录下的所有文件。 请注意,如果未给出文件操作数,grep 将搜索工作目录。 这相当于 -d 递归选项。
对于简单的解决方案,请尝试:
grep '^a' regex.txt
(目前尚不清楚这种模式为何要使用该-E
开关。)
答案2
rgrep
是一个快捷方式(在我的 ubuntu 18.04 上:一个脚本)grep -r
。man grep
:
-r, --recursive Read all files under each directory, recursively,
事实上,使用cat
是没有意义的,因为rgrep
似乎忽略了它。