2015-12-06 55 views
0

使用grep,如何匹配包含一個但只有一個一位數字的行?輸入文件的顯示包含一個且只有一個單位數字的行

實施例:

SHELL=/bin/sh 
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 

    # m h dom mon dow user command 
    17 * * * * root cd/&& run-parts --report /etc/cron.hourly 
    25 6 * * * root test -x /usr/sbin/anacron || (cd/&& run-parts --report /etc/cron.daily) 
    47 6 * * 7 root test -x /usr/sbin/anacron || (cd/&& run-parts --report /etc/cron.weekly) 
    52 6 1 * * root test -x /usr/sbin/anacron || (cd/&& run-parts --report /etc/cron.monthly) 
    # 

輸出應爲:

25 6 * * * root test -x /usr/sbin/anacron || (cd/&& run-parts --report /etc/cron.daily) 
+1

你試圖得到什麼結果? – EL3PHANTEN

回答

0

隨着GNU的grep:

grep '\b[0-9]\b' file | grep -v '\b[0-9]\b.*\b[0-9]\b' 

輸出:

 
    25 6 * * * root test -x /usr/sbin/anacron || (cd/&& run-parts --report /etc/cron.daily) 
+0

這適用於給定的樣品的數據,但'\ B'是一個字邊界和數字和其他字母數字字符之間不進行區分。所以,它會認爲'a6'是一個兩位數的數字,並且會失敗。 –

+0

This:'grep -P'\ D \ d \ D'file | 。-Vp的grep「\ d \ d \ d * \ d \ d \ D. * root''應該解決所有的問題::-D –

0

爲了在僅含有一個單一的數字文件的grep線,並且只有一個單一的數字

執行此

grep -P '^\D*\d\D*$' file 

-P標誌是使Perl表達式

http://www.gnu.org/software/grep/manual/grep.html

該表達式本身是一個正則表達式

'^\D*\d\D*$' 

'^' = 'start of a line' 
'\D*' = '0 or more non-digits' 
'\d' = '1 digit' 
'\D*' = '0 or more non-digits' 
'$' = 'End of line' 




更新:

即使問題得到解答和接受,這種解決方案可以幫助別人誰碰到這個問題。正如TomZych在評論中提到P是實驗性的,所以我將它與E切換,這是--extended-expression。

標題改變後,我以前的答案不是OP想要的。 因此,這裏是新的表達式:

grep -E '^([^0-9]|[0-9]{2,})*([0-9][^0-9]*)([^0-9]|[0-9]{2,})*$' file 

表達解釋

'^' # start of line 


我們先從第一組。

([^0-9]|[0-9]{2,})* # The first group: 

'(...)' # what ever is inside the parantheses is in the group. 
'*'  # means repeat this expression zero or more times. 

'[^0-9]', '[0-9]' # means all digits from 0-9, but the 
'^'  # means NOT when its in the squared brackets. 
'{2,}' # means this expression 2 or more times 
'|'  # means OR 

# So what we want here is: 
# Zero or more, (non-digits characters or two or more digits numbers) 

# This will match anything untill we meet a single digit number. 



然後是第二組。

([0-9][^0-9]*) # second group: 

# Here we want to match a single digit 
'[0-9]' 
# Followed by zero or more non-digits 
'[^0-9]' 

# This will match the single digit, the first group ran into. 
# I use zero or more incase its the end of the line. 


然後3.組至極實際上是再次第一組中,零次或多次。

# Followed by 
'$' # End of line 


這將匹配任何行,其中僅存在一個單個數字。

1 abc 123 
abc 1 123 
abc 123 1 
abc 1 abc 
123 1 123 
abc1abc 

# will all match 
+0

這在任何地方匹配包含單個位數行並沒有其他的數字。不是OP想要什麼。嘗試使用示例數據,它失敗。 –

+0

@TomZych我明白他的意思是標題已經改變。 – EL3PHANTEN

+0

我假設你會更新它。比我的回答更清潔,但我的grep(GNU的grep 2.12)的文檔說-P是「高度實驗性和'grep的-P」可能會警告未執行的功能」。如果它工作,很好,但我會很生氣。 –

0

這將在 開始或結束該行的匹配單個數字(SDN),只要它不是:

[^0-9][0-9][^0-9] 

所以,一個脆弱的解決辦法是:

cat input | 
grep '[^0-9][0-9][^0-9]' | 
grep -v '[^0-9][0-9][^0-9].*[^0-9][0-9][^0-9]' 

(在這裏,cat input任何東西管道數據矗立在給它的其餘部分。 你也可以給grep的文件名。)

第一grep捕獲與一個或多個的SDN的線,並且所述第二 一個排除那些具有不止一個。

但是,它在 行的開頭或末尾將無法注意到SDN,這兩行都會漏掉行幷包含我們不想要的行。一個簡單的 解決方案是臨時添加一個字符到每一行的每一端。

cat input | 
sed -r 's/(.*)/x\1x/' | 
grep '[^0-9][0-9][^0-9]' | 
grep -v '[^0-9][0-9][^0-9].*[^0-9][0-9][^0-9]' | 
sed -r 's/^x(.*)x$/\1/' 
相關問題