2016-07-27 44 views
0

我想查找一行文本中減號後面跟隨一位數字的所有實例。這些數字是用逗號分隔的,但也可以在該行的末尾對方括號內的換行符進行縮放(使用正則表達式)[]

的text.txt包含

hx,-7,u,-9,u,-8 

(有一個在後面的新行)

我運行此命令

egrep -o ',[\-][0-9][\n,]' text.txt 

並獲得

,-7, 
,-9, 

但我想

,-7, 
,-9, 
,-8 

編輯: 喜歡的東西

hx,-7,u/-9,u,-8 

仍應產生

,-7, 
,-9, 
,-8 

而且使用

egrep -o ',[\-](1|2)?[0-9XY][\,$]' text.txt 

對此不起作用

+0

你可以改變你的最後一個字符類'[^ 0-9]' – rgoliveira

+1

在'grep'中,使用'$'錨來結束行就足夠了。 * nix中的文本文件使用'\ n'來終止一行。試試'egrep -o',[\ - ] [0-9](,| $)'text.txt'。 – alvits

+0

@alvits謝謝,這不是在我的問題,但實際上有更多的選擇,不僅僅是「,」或\ n數字也可以通過「/」字符繼承。所以我需要像egrep -o',[\ - ](1 | 2)?[0-9XY] [\ /,$]'text.txt,但這不適用於「$」 – Jacob

回答

1

grep工作在每行的基礎上,並且新行字符不匹配,因爲它們被視爲每行的分隔符。

How to give a pattern for new line in grep?表示pcregrep可以執行多行grep操作。

或者,您也可以使用tr\n字符轉換爲,即:

cat text.txt | tr '\n' ',' | egrep -o ',[\-][0-9][\n,]' 

產量:

,-7, 
,-9, 
,-8, 
+0

OP不尋找多行匹配'grep',但很容易被誤讀。但是,您的解決方案是一個壞主意。首先,您要連接文件的所有行。想象一下,如果輸入文件是日誌。正如你所指出的那樣,grep是面向行的。想象一下,在將所有行連接成一行後,必須解析的長行。 – alvits

+0

同意。原來的聲明問題陳述只是表明文本文件包含一行。您的錨定解決方案更受歡迎。 – theorifice