2016-08-02 171 views
0

有人可以幫助我瞭解,爲什麼這不起作用?sed +/*不按預期工作

我有一個文件sedTest.txt的內容:

sdjalsh ABC 123 ashfaladhs 
ldjkasf ABC 234 dadas afsf 
dafsafs ABC 876 asf dasfaf 

我想輸出,只是那些123,234,876

我可以管理,使用

cat sedTest.txt | sed s"/.*ABC \([0-9]+\).*/\1/" 

我用這種方式,因爲通常有grep而不是貓,它可能是

grep ABC sedTest.txt | sed s"/.*ABC \([0-9]+\).*/\1/" 

這使得這裏不是一個真正的感覺,但這是。典型原木使用...

我想知道的是,爲什麼使用[0-9] +不工作,我期望相同的結果至於[0-9] *,但似乎沒有任何內容被替換(並且未打印內容)。

請隨時問我是否需要指定缺少的東西。

回答

2

+是一個ERE元字符,sed默認使用BREs。使用sed -E ... + ...sed ... \+ ...以啓用+的ERE屬性,例如,

grep 'ABC' sedTest.txt | sed -E 's/ABC ([0-9]+).*/\1/' 

,請注意您不再需要爲了躲避括號,以使他們的ERE元字符屬性,當您使用-E和領先.*在做,所以我擺脫它沒什麼用處。此外,你不需要的grep sed的+,這是不行的:

sed -E -n 's/ABC ([0-9]+).*/\1/p' sedTest.txt 

,但更重要的是,你真的應該使用:

awk '$2=="ABC"{print $3}' sedTest.txt 

而不是爲清晰,簡單,魯棒性,便攜性等。除非你喜歡當shell在您的工具之前決定解釋腳本中的某些值時的驚喜,否則應該在單引號(')中包含腳本(sed,awk,grep,不管),而不是雙精度(")看到他們。

+0

感謝您澄清這一點。你能否添加一些描述EREs/BREs更詳細的鏈接(或其他的參考資料)。在您的帖子後,我注意到這個縮寫在sed手冊頁... – Betlista

+0

不,只是谷歌他們。理解BREs/EREs是編寫shell腳本的基礎,爲這些添加鏈接就像添加鏈接來描述「if」和「then」。 –