2011-01-05 127 views

回答

27

這裏有一個簡單的例子:

$ echo 'abcabcabc' | sed 's/\(ab\)c/\1/' 
ababcabc 
$ echo 'abcabcabc' | sed 's/\(ab\)c/\1/g' 
ababab 
$ echo 'abcabcabc' | sed 's/\(ab\)\(c\)/\1d\2/g' 
abdcabdcabdc 

在第一個命令,只有第一場比賽受到影響。在第二個命令中,每個匹配都會受到影響。在這兩種情況下,\1都是指由轉義括號捕獲的字符。

在第三個命令中,指定了兩個捕獲組。他們被稱爲使用\1\2。最多可以使用九個捕獲組。

除了g(全球)運算符(或沒有它,第一場比賽),你可以指定一個特定的比賽:

$ echo 'aaaaaa' | sed 's/a/A/4' 
aaaAaa 
+0

什麼是\\ 1做的,是否擴展了正則表達式? – Timo 2017-12-13 15:48:44

+0

這是\\ 1的示例:'sed -E -e「s/[^ /] {10}(\\。[^ \\。] +)?$/\\ 1 /」' – Timo 2017-12-13 16:03:55

+1

@Timo :'\ 1'插入第一個捕獲組的內容,該內容是第一組括號之間匹配的內容。我不知道你是否特別要求使用加倍反斜槓的情況,但無論它們是否加倍,似乎都起作用。我不會說這是一個擴展正則表達式的情況,因爲即使在使用基本正則表達式時它也會執行相同的操作。 – 2017-12-13 17:40:10

10

\(...\)將捕獲在parens內指定的字符,而\1將用於引用第一個匹配,這是正則表達式的一部分。

+1

很好的回答。我只是想補充一點,這意味着引用的特定示例會刪除逗號或等號後​​面的空格,因爲\ 1會放回任何在包含空格之間匹配的空格。 – 2011-01-05 22:52:56

+0

如果你只參考第一場比賽,那麼是否需要/ g? – 2011-01-05 22:53:15

+0

aka「back references」 – SiegeX 2011-01-05 22:54:03