簡體   English   中英

我可以執行“非全局”grep 並僅捕獲為每行輸入找到的第一個匹配項嗎?

[英]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

我認為你可以 grep non /字母,如:

grep -Eo '^[^/]+'

在另一個 SO 站點上,還有另一個類似的問題和解決方案。

-o選項表示打印與您的模式匹配的每個子字符串,而不是打印每個匹配的行。 您當前的模式匹配每個不包含斜杠的字符串(可選地包括尾部斜杠); 但是很容易切換到只在一行的開頭匹配這個模式的模式。

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

請注意添加了^行錨點開頭,省略了-P選項(無論如何您都沒有真正使用過)以及愚蠢的初學者錯誤{1}

(我應該補充一點,普通grep不支持括號或重復; grep -E可以很好地支持這些結構,您可以切換到腳趾 POSIX BRE 變體,這需要反斜杠才能使用圓括號或花括號作為元字符。您可能可以忽略這些細節並在任何地方使用grep -E除非您確實需要grep -P的功能,但也要注意-P不可移植。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM