2013-01-18 55 views
0

我正在使用sed命令將一些文本轉換爲另一個文本。在下一行使用sed進行排除

貓文字

  <strong>ABC 
      </strong> 

Commnad:

  sed -e 's|<strong>(.*?)</strong>|//textbf{1}|g' 

預期的結果:\ textbf {ABC}

,但使用上面的腳本我不能將其轉換爲預期產出,因爲有新線標籤之間。如何處理這種情況?

+0

使用'N'或'N'建立與SED多行的模式空間。 –

+0

我使用了sed -ne的| <strong>(。*?)</strong > | // textbf {1} | g'text但我沒有輸出。 – Manish

+0

不是'-n','N'在sed命令中。以下是有關在sed中使用多行的詳細信息的鏈接:http://www.grymoire.com/Unix/Sed.html#uh-51 –

回答

1

這可能爲你工作(GNU SED):

sed -r '$!N;s|(&lt;)(strong&gt;)([^\n]*)\n\s*\1/\2|//textbf{\3}|;P;D' file 

sed '$!N;s|\(&lt;\)\(strong&gt;\)\([^\n]*\)\n\s*\1/\2|//textbf{\3}|;P;D' file 
+0

我強有較強的BR與像<強> ABC中風< BR/> < /強>,im有點困惑,因爲它是嵌套使用上述。 – Manish

1
sed -e 'N;s|&lt;strong&gt;\(.*\?\)\n&lt;/strong&gt;|\/textbf{\1}|g' 

正如CodeGnome和David Ravetti所說,N標誌允許多行模式。

+0

我使用sed -e'N; s | <strong> \(。* \?\)\ n </strong > | \ textbf {\ 1} | g'text但仍然沒有變化。 – Manish

+1

你錯過了(。 – cdbitesky

+0

@cdbitesky前面的\,在你的例子中你有'\?'...是故意的嗎?似乎它會搜索字符「?」,當我認爲OP的意圖是('*)'部分是可選的(我認爲這是不必要的,因爲「*」應該匹配零或更多) –