2015-08-22 2 views
1

я следующую строкузамена Сед на баш

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

, и я хочу, чтобы заменить слово «worklightconsole» с «приложения», так что результат выглядит ниже

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

Я попытался следующий (и несколько других вариантов) с использованием «СЭД», но не мог заставить его работать

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

и я получил выход в

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

Вместо того чтобы заменить слово «worklightconsole» он заменил «worklightconsole/JDBC» с «приложения»

Что я делаю неправильно, а также то, что подразумевается под «*» в СЭД?

+0

Я думаю, вы можете использовать 's/jndiName = \" [^ \ "\ /] +/jndiName = \" app/g';). –

ответ

0

С GNU СЭД:

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

заменить "на месте":

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

.: соответствует любому символу, один раз

.*: соответствует любому символу ноль или больше раз

+0

Он работал как шарм. Однако, можете ли вы объяснить мне, как работает этот шаблон, я очень хочу знать, что такое \ \app \ 2? –

+0

'\ 1' относится к выражению в первой паре круглых скобок' jndiName = "' и '\ 2' относится к выражению во второй паре круглых скобок'/jdbc/WorklightDS''. С '\ 1app \ 2' результатом является' jndiName = "app/jdbc/WorklightDS" ' – Cyrus

+1

Отличное объяснение, спасибо –

Смежные вопросы