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