2016-10-10 2 views
0

Я знаю, что могу сделать это с помощью SED. Но в моей конкретной задаче это довольно сложно. Поэтому я не мог понять, несмотря на множество примеров на этом сайте.Найти и заменить строку в сценарии bash с помощью SED

У меня есть файл конфигурации с учетными данными.

<username><![CDATA[prefix_cms]]></username> 
<password><![CDATA[complexpwd]]></password> 
<dbname><![CDATA[prefix_cms]]></dbname> 

Я хочу изменить все учетные данные на новое уникальное значение. Это проблема, когда я использую find для замены SED, потому что он изменяет имя пользователя и имя db на его новое значение.

Новые значения должны быть, например:

newusername 
newpassword 
newdbname 

Как мне это сделать? Я искал первое появление в SED, но не смог заставить его работать по какой-то причине.

Я также попытался найти и заменить всю строку, включая пробы XML и CDATA, но это делает ее более сложной из-за персонажей.

Как я могу это решить?

EDIT:

Выход я ищу.

<username><![CDATA[newusername]]></username> 
<password><![CDATA[newpassword]]></password> 
<dbname><![CDATA[newdbname]]></dbname> 

Ищете первый ответ, я вижу, что я не очень четко представлял, что я хотел.

EDIT2:

Я нашел идеальное решение здесь: Sed regex change of file

+0

Почему -1? Обратная связь? – Akif

+0

Можете ли вы опубликовать весь ожидаемый результат для ясности? нет совпадения, чтобы предлагать какие-либо проблемы, поэтому добавьте свою попытку, чтобы вы могли узнать, где вы поступили неправильно, и я тоже не уменьшил ... – Sundeep

+1

Я не голосовал, но интересно, где ожидаемый результат или усилия, которые вы вложили в него? –

ответ

1

Do:

sed -E 's/username|password|dbname/new&/g' file 
  • username|password|dbname соответствует любому из username, password, dbname

  • в замене, new является perpended перед каждым матчем (&), и делается на всех вхождений матча в линии (g)

Пример:

% cat file.txt 
<username><![CDATA[prefix_cms]]></username> 
<password><![CDATA[complexpwd]]></password> 
<dbname><![CDATA[prefix_cms]]></dbname> 

% sed -E 's/username|password|dbname/new&/g' file.txt 
<newusername><![CDATA[prefix_cms]]></newusername> 
<newpassword><![CDATA[complexpwd]]></newpassword> 
<newdbname><![CDATA[prefix_cms]]></newdbname> 

Ответ на отредактированный вопрос:

sed -E 's/^(<([^>]+).*\[)[^]]+(.*)/\1new\2\3/' file 

Пример:

% cat file.txt 
<username><![CDATA[prefix_cms]]></username> 
<password><![CDATA[complexpwd]]></password> 
<dbname><![CDATA[prefix_cms]]></dbname> 

% sed -E 's/^(<([^>]+).*\[)[^]]+(.*)/\1new\2\3/' file.txt 
<username><![CDATA[newusername]]></username> 
<password><![CDATA[newpassword]]></password> 
<dbname><![CDATA[newdbname]]></dbname> 
+0

Спасибо, я вижу, что я не совсем понял, что хочу, я редактировал вопрос с ожидаемым выходом. – Akif

+0

@Akif проверить мои правки. – heemayl