2015-08-22 119 views
1

我有以下字符串sed替換上的bash

<dataSource jndiName="worklightconsole/jdbc/WorklightDS" transactional="false"> 

,我想用「應用」一詞取代「worklightconsole」使輸出看起來像下面

<dataSource jndiName="app/jdbc/WorklightDS" transactional="false"> 

我試過以下(和其他幾個選項)使用'sed'但無法使其工作

sed -e 's/\<dataSource\ jndiName=\".*\//\dataSource\ jndiName=\"app\//g' 

我得到的輸出爲

<dataSource jndiName="app/WorklightDS" transactional="false"> 

而是與「應用」

什麼我做錯了,也什麼叫一詞替換「worklightconsole」它取代「worklightconsole/JDBC」的「*」在sed?

+0

我認爲你可以使用's/jndiName = \「[^ \」\ /] +/jndiName = \「app/g';)。 –

回答

0

隨着GNU sed的:

sed -E 's|(jndiName=")[^/]*(/jdbc/WorklightDS")|\1app\2|' file 

爲 「到位」 代替:

sed -E -i 's|(jndiName=")[^/]*(/jdbc/WorklightDS")|\1app\2|' file 

.:一次

.*匹配任何字符:任何字符匹配零或更多時間

+0

它像一個魅力。但是,你能否向我解釋這種模式的工作方式,特別是我渴望知道'\ 1app \ 2'是什麼? –

+0

'\ 1'指的是第一對圓括號中的表達式'jndiName =「',而'\ 2'則表示第二對圓括號'/ jdbc/WorklightDS」中的表達式。用'\ 1app \ 2'結果是'jndiName =「app/jdbc/WorklightDS」' – Cyrus

+1

很好的解釋,謝謝 –