2017-02-17 49 views
1

sed -i.bak -e 's/^\s+({\s+group.+;\s+port.+;)\s+cp.+/ \1 }/g' <file>愚蠢的sed /正則表達式錯誤?

我得到一個錯誤:

sed: -e expression #1, char 48: invalid reference \1 on ``s' command's RHS

我以前做過這些sed命令幾次,都沒有這個問題。我絆倒了一個我錯過的細微角色模式嗎?我已經在網站上測試了正則表達式,所以我很確定它沒有問題。我已經在網上查看了許多sed示例,但無法找到任何內容。提前致謝。 實施例線路相匹配:

{ group = "127.0.0.1"; port = 222; cpu = 33; },

+1

是否與''s/^ [[工作e:]] * \({[[:space:]] * group。*; [[:space:]] * port。*; \)[[:space:]] * cp。*/\ 1}/g''? –

+1

我不知道這是否是主要問題,但是:捕獲括號需要轉義,不支持'\ s',您應該使用'[\ t]'或者使用posix字符類,+量詞也不支持。 –

+1

這個錯誤是因爲在'sed'的默認BRE模式下,您正在使用未轉義的'(...)',它不會生成捕獲的組。你需要使用'-E'標誌來擴展正則表達式模式,然後'(...)'將它作爲一個組。除了'\ s'應該被'[\ t]替換' – anubhava

回答

0

您當前的表達被解析爲一個BRE(基本正則表達式)。這意味着:

1)括號必須逸出到dentote捕獲組, 2)\s不被支持,必須用[ \t][[:space:]] 3)+量詞應該變成\{1,\}替換,因爲它不支持

你需要傳遞-r選項(在其他操作系統,-E可以做這個工作,而不是),使發動機解析它作爲ERE:SPAC:

sed -i.bak -r -e 's/^\s+({\s+group.+;\s+port.+;)\s+cp.+/ \1 }/g' <file>