我可以执行“非全局” grep并仅捕获为每行输入找到的第一个匹配项吗?

我知道我要问的是可以使用awk或sed来完成的,我在这里问如何使用GREP做到这一点。

给出以下输入:

.bash_profile
.config/ranger/bookmarks
.oh-my-zsh/README.md

我想使用GREP获取:

.bash_profile
.config/
.oh-my-zsh/

当前我正在尝试

grep -Po '([^/]*[/]?){1}'

输出结果:

.bash_profile
.config/
ranger/
bookmarks
.oh-my-zsh/
README.md

是否有一些简单的方法可以使用GREP仅获得每一行的第一个匹配字符串?

tiaozhanjixian123 回答:我可以执行“非全局” grep并仅捕获为每行输入找到的第一个匹配项吗?

您根本不需要grep

cut -d / -f 1
,

我认为您可以grep非/字母,例如:

grep -Eo '^[^/]+'

在另一个SO网站上,还有一个类似的question解决方案。

,

-o选项表示要打印与模式匹配的每个子字符串,而不是打印每个匹配的行。您当前的模式匹配每个不包含斜杠(可选地包括尾部斜杠)的字符串;但是很容易切换到仅与行首匹配此模式的模式。

grep -o '^[^/]*' file

请注意,在行锚处添加了^,并省略了-P选项(无论如何您实际上都没有使用)以及愚蠢的初学者错误{1}

(我应该补充一点,grep不支持括号或重复; grep -E将支持这些结构,您可以切换到POSIX BRE变体,这需要使用反斜杠来使用或圆括号作为元字符。您可能会忽略这些详细信息,而只是在各处使用grep -E,除非您确实需要grep -P的功能,但还要知道-P不可移植。)

本文链接:https://www.f2er.com/2709915.html

大家都在问