1

По сути, я думаю, что этот вопрос скорее относится к регулярным выражениям, чем к SED, но я использую именно SED, и именно с этого я и начинаю.

У меня есть файл конфигурации web.config для веб-сайта ASP.NET 2.0, для которого я автоматизирую процесс сборки. Я использую UNIXUtils, чтобы дать мне дополнительную мощность сверх того, что предоставляется Windows. Используя SED, кто-то может просветить меня о том, как я могу выполнить следующее;

+ Изменить

Data Source=RANDOM-SERVER;Initial Catalog=SomeDatabase;Persist Security Info=True;User ID=MyUser;Password=*************;

к

Data Source=PRODUCTION-SERVER;Initial Catalog=SomeDatabase;Persist Security Info=True;User ID=MyUser;Password=*************;

Я пробовал следующее

sed s"|Data Source=.*;|Data Source=PRODUCTION-SERVER;|g"

но я получаю

Data Source=PRODUCTION-SERVER;

то есть sed очень старательно жаден и съедает всех персонажей до последней точки с запятой, по крайней мере, это то, что он, похоже, делает.

КСТАТИ: Да, я хотел бы сохранить жадный оператор | g в конце, чтобы гарантировать, что изменение применяется ко всем вхождениям в исходном файле, хотя, теоретически, не должно быть.

Если кто-то может показать мне, как это сделать, я был бы благодарен, хотя я подозреваю, что не существует простого способа сделать это, так как я не смог найти в сети ничего, что соответствовало бы моим требованиям. Досадно, что все сосредоточены на путях той или иной формы.

Если это не может быть сделано в SED, но может быть сделано с помощью чего-то другого в стандартном наборе UNIXUtils, тогда это приемлемый ответ, я открыт для предложений.

2 ответа2

2

Используйте несоответствующую группу символов ([^;]) вместо точки (.), Например:

sed s"|Data Source=[^;]*|Data Source=PRODUCTION-SERVER|"

Обратите внимание, что глобальный флаг (g) в конце означает "заменить все вхождения в текущей строке" и не жадный.

1

Насколько я знаю, у sed нет способа сделать не жадное сопоставление, его регулярные выражения всегда жадные (и, как уже указывалось, флаг g означает совпадение всех вхождений в текущей строке, он будет искать весь файл по умолчанию).

Я бы сделал это либо с помощью группы символов, предложенной @Thor, либо с помощью инструмента, который поддерживает не жадные совпадения, такие как Perl:

perl -pne 's/Data Source=.+?;/Data Source=PRODUCTION-SERVER;/' file 

В Perl регулярное выражение, конструкция +? значит найти хотя бы одного (+) но как можно меньше (?) соответствующие символы. -p означает печатать каждую строку, а -n означает читать входной файл построчно и применять сценарий, указанный в качестве аргумента для -e . Наконец, вы также можете редактировать файл на месте с помощью опции i :

perl -i -pne 's/Data Source=.+?;/Data Source=PRODUCTION-SERVER;/' file 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .