[英]Can I perform a 'non-global' grep and capture only the first match found for each line of input?
我知道我要问的是可以使用 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 仅获取每行上的第一个匹配字符串?
你根本不需要grep
。
cut -d / -f 1
-o
选项表示打印与您的模式匹配的每个子字符串,而不是打印每个匹配的行。 您当前的模式匹配每个不包含斜杠的字符串(可选地包括尾部斜杠); 但是很容易切换到只在一行的开头匹配这个模式的模式。
grep -o '^[^/]*' file
请注意添加了^
行锚点开头,省略了-P
选项(无论如何您都没有真正使用过)以及愚蠢的初学者错误{1}
。
(我应该补充一点,普通grep
不支持括号或重复; grep -E
可以很好地支持这些结构,您可以切换到脚趾 POSIX BRE 变体,这需要反斜杠才能使用圆括号或花括号作为元字符。您可能可以忽略这些细节并在任何地方使用grep -E
除非您确实需要grep -P
的功能,但也要注意-P
不可移植。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.