2017-03-21 170 views
1

在我的腳本中,我通過降價文件並使用sed,我試圖找到沒有一個或多個#並且不是空行的行,然後圍繞這些行與<p></p>標籤 1沒有定義在RE

我的理由:

^[^#]+在行首,發現不與1個或多個#開頭的行

.\+然後查找包含一個或多個字符線(又名不是空行)

然後用<p>\1</p>替換匹配的行,其中\1表示匹配的行。

但是,我收到「\ 1未在RE中定義」。我的推理是否正確,我該如何解決這個錯誤?

BODY=$(sed -E 's/^[^#]+.\+/<p>\1</p>/g' "$1") 
+0

'\ 1'是指一對括號內的第一個匹配,例如'(。)'。你沒有任何這樣的表達。 –

+0

如果你想替換整個比賽,使用'&' – Barmar

回答

3

反斜槓後跟一個數字被替換爲匹配的正則表達式的第N個捕獲組,但你的正則表達式沒有捕捉組。

如果要更換整場比賽中,使用&

BODY=$(sed -E 's%^[^#].*%<p>&</p>%' "$1") 

你並不需要使用.+找到非空行 - 它在開頭一個字的事實,不匹配#表示它不是空的。 [^#]之後你不需要+ - 你所關心的只是第一個字符不是#。當正則表達式匹配整行時,您也不需要g修飾符 - 只需要每行替換多個匹配即可。

而且由於您的替換字符串包含/,您需要將其轉義或將分隔符更改爲其他字符。

+0

好吧,我嘗試過,但我得到了壞標誌替代命令:'>' – 14wml

+0

nvm計算出來我改變了定界符爲'BODY = $(sed -E '%^ [^#]。*%

%g'「$ 1」)' – 14wml

+0

您不需要'g'修飾符,因爲它每行只能匹配一次。 – Barmar