2014-06-15 46 views
-1

我在學習unix中的sed。我需要一些幫助。我試圖理解爲什麼echo「abc 123」| sed's/([0-9] [0-9] [0-9] )/ 1 /'

echo 123 abc | sed 's/\([0-9][0-9][0-9]\)/\1/' ] 

,當我嘗試打印三個數值字母「123」不工作, 但它的作品,當我使用

echo 123 abc | sed 's/.* \([0-9][0-9][0-9]\).*/\1/' 

我怎樣才能打印出「12」而不是「123」?

請讓我知道sed是如何工作的以及我的方法錯誤。

+2

你覺得's/\([0-9] [0-9] [0-9] \)/ \ 1 /'是什麼意思? – ruakh

+0

在第一個例子中,你在行尾有一個額外的']。你想要做什麼:'echo 123 abc | sed's/123/12 /''? – alfasin

回答

0

你可能要麼需要這樣的:

echo 123 abc | sed 's/123/12/' 

,或者如果你想使用正則表達式來概括123

cho 123 abc | sed 's/\([0-9]\)\([0-9]\)\([0-9]\)/\1\2/g' 
+1

您可以使用'-r',因此您不需要轉義'()':'echo 123 abc | sed -r's /([0-9])([0-9])([0-9])/ \ 1 \ 2/g'' – Jotne

+0

不錯!謝謝Jotne!順便說一句,在我的Mac上'-r'無法識別,我不得不使用'-E'。 – alfasin

0

在你的第一個命令:([0-9][0-9][0-9])123場比賽,並把它放在第1組,您可以通過\1來引用它。

那麼爲什麼你的第一個命令沒有給你123?正則表達式是正確的,這是因爲你正在替換123(匹配[0-9][0-9][0-9])與123(引用\1),它似乎發生了一些事情。

現在,你可能會明白爲什麼第二個命令有效。由於.匹配任何字符和*手段重複零次或多次,所以 ([0-9][0-9][0-9]).*匹配整個字符串,並在你第二個命令把123組1

所以要更換整個字符串123sed打印出模式空間中的內容默認情況下。

如果您只想打印12,只需將([0-9][0-9][0-9])更改爲([0-9][0-9])即可。您可以使用[0-9]{3}而不是[0-9][0-9][0-9]

相關問題