2013-12-12 225 views
0
echo "This is a test string" | sed 's/This/\0/' 

首先我使用正則表達式This匹配子串This。然後我用\0替換第一個匹配的整個字符串。所以結果應該只是匹配的字符串。爲什麼不sed正確解釋這個正則表達式?

但它打印出整條線。這是爲什麼?

+0

你想用'\ 0'打印什麼?字面上,字符串'\ 0'? – fedorqui

+0

@fedorqui不,我打算使用第一個正則表達式匹配,而不是字面字符串'\ 0' –

+0

正如pfnuesel所說,你用同一個字符串替換了一個字符串,所以結果是一樣的。做例如'sed's/This/\ 0AA /''來看看它。 – fedorqui

回答

3

您不用\0替換整個字符串,只是模式匹配,即This。換句話說,你用This代替This

要與This更換整條生產線,你可以這樣做:

echo "This is a test string" | sed '/This/s/.*/This/' 

它看起來匹配This線,並用其替換This整條生產線。在此情況下(由於只有一條線),你也可以這樣做:

echo "This is a test string" | sed 's/.*/This/' 

如果你想重用了比賽,那麼你可以做

echo "This is a test string" | sed 's/.*\(This\).*/\1/' 

\(\)用來記住在他們內部匹配。它可以參考爲\1(如果您有多對\(\),那麼您也可以使用\2,\3,...)。

在以上示例是不是非常有幫助,因爲我們知道這裏面\(\)這個詞This,但如果我們有可以匹配不同的詞在括號內一個正則表達式,這是非常有益的。

+1

替換必須從字符串中選擇。也許我用了一個錯誤的例子來說明我的問題。我需要使用'\ d \ d \ d \ d'選擇一個數字,然後用它作爲替換。所以你的建議是行不通的。 –

+0

編輯我的答案。 – pfnuesel

+0

sed因爲某些原因需要你跳過括號,試試'。*(This)。*'在regexpal上。 –

0
sed 's/.*\(PatThis\).*/PatThat/' 

se '/PatThis/ s/.*/PatThat/' 

在您的要求 「PatThis」 和 「PatThat」 是相同的含有( 「本」)。在評論(

我需要使用來選擇號碼\ d \ d \ d \ d,然後用它作爲 更換

),你必須爲模式PatThis和PatThat 2個不同的值 \ 1不是真的需要,因爲你知道確切的內容(除非'PatThis'是一個帶有特殊字符的正則表達式,例如\ & ?.)

相關問題