簡體   English   中英

使用grep只匹配一行中的模式一次

[英]Use grep to match a pattern in a line only once

我有這個:

 echo 12345 | grep -o '[[:digit:]]\{1,4\}'

這給了這個:

1234
5

我知道發生了什么事。 如何在成功匹配后阻止grep嘗試繼續匹配?

我怎么才得到

1234

你想要grep停止匹配還是只關心第一場比賽。 如果后者屬實,你可以使用head ...

`grep stuff | head -n 1` 

Grep是一個基於行的util,所以-m 1標志告訴grep在匹配第一后停止,當第一與head結合時實際上相當不錯。

您需要進行分組: \\(...\\)后跟確切的出現次數: \\{<n>\\}來完成工作:

maci:~ san$ echo 12345 | grep -o '\([[:digit:]]\)\{4\}'
1234

希望能幫助到你。 干杯!!

使用sed而不是grep

echo 12345 | sed -n '/^\([0-9]\{1,4\}\).*/s//\1/p'

這在行的開頭匹配最多4位數,后跟任何內容,只保留數字,然后打印它們。 -n阻止打印行。 如果數字字符串也可能出現在中間位置,則需要稍微復雜的命令。

事實上,理想情況下,你將使用帶有PCRE正則表達式的sed ,因為你真的需要一個非貪婪的匹配。 但是,在合理的近似值下,您可以使用:( 對一個相當復雜的問題的半解決方案......現在已刪除!

由於您需要第一個最多4位數的字符串,只需使用sed刪除任何非數字,然后打印數字字符串:

echo abc12345 | sed -n '/^[^0-9]*\([0-9]\{1,4\}\).*/s//\1/p'

這匹配一串非數字后跟1-4位數字后跟任何內容,只保留數字,然后打印它們。

如果 - 在您的示例中 - 您的數值表達式將出現在您開始的字符串的開頭,您可以添加一個行首錨^

echo 12345 | grep -o '^\([[:digit:]]\)\{1,4\}'

根據您想要的確切數字,行尾錨定$也可能有所幫助。

grep manpage關於這個主題的說法(參見“正則表達式”一章):

 (…)

 {n,}

      The preceding item is matched n or more times. 

 {n,m}     

      The preceding item is matched at least n times, but not more than m times. 

 (…)

所以答案應該是:

 echo 12345 | grep -o '[[:digit:]]\{4\}'

我剛剛在cygwin終端(2018)上進行了測試,它運行良好!

暫無
暫無

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

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