Intereting Posts
Разделение нескольких определенных файлов из многих в каталог с помощью терминала? Как освободить место на невосприимчивой полной системе btrfs? Безопасный способ ограничить пользователей входа в систему FTP в один каталог Как вы можете получить любую версию Linux для просмотра SSD MacBook Pro 2018 года? xargs и <и> в те же файлы crontab устанавливает пользовательскую переменную, перенаправляет вывод и обнаруживает подключенную сеть Как удалить позиционный параметр из $ @ Как я могу перейти вверх или вниз в tmux с помощью Terminal.app? Как я могу коснуться каждого файла в каталоге? Отличия пакета CentOS для Python3 между python36 и python36u Почему эта переменная не имеет значения, даже если она установлена ​​в .bashrc? Сервер Linux как маршрутизатор – проблема Получение информации о виртуальной файловой системе где находится `cd`? перемещать файлы определенного шаблона в другой каталог

sed предотвращает удаление остальной линии

У меня есть файл, содержащий строку, которую я хочу заменить чем-то посредине:

database.url=jdbc:mysql://my.sql.ip.address:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull 

Предположим, что я хочу изменить IP-адрес; Я использовал следующую команду sed :

 sed -i -r 's/(database.url=jdbc:mysql:\/\/).+(:.+)/\1zizi/' myFile 

Эти результаты:

 database.url=jdbc:mysql://zizi 

Но я хочу:

 database.url=jdbc:mysql://zizi:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull 

Как мне написать свой sed ? Есть ли какая-нибудь другая команда, которую я могу использовать, чтобы лучше это получить?

Просто напечатайте вторую следующую захваченную группу также \2 (я не изменяю или не улучшаю ваш sed )

 sed -i -r 's/(database.url=jdbc:mysql:\/\/).+(:.+)/\1zizi\2/' myFile 

это улучшенная команда для изменения только согласованной IP-части.

 sed 's/[1-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/NEWIP/' infile.txt 

Если только для строк начинается с database.url :

 sed '/^database\.url/ s/[1-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/NEWIP/' infile.txt 

Или в большей способности и даже короче.

 sed 's/\([1-9]\)\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}/NEW/' 

Обратите внимание, что это также может изменить и улучшить, чтобы соответствовать точному IP-адресу, а не соответствовать. 1.1.1.999 как IP, который недействителен.

Более короткий подход:

 sed 's~\(.*mysql://\)[^:]*~\1zizi~' file 

Выход:

 database.url=jdbc:mysql://zizi:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull 

Короткое решение sed без обмана:

 $ sed 's#//[^:]*#//zizi#' file database.url=jdbc:mysql://zizi:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull 

Это заменяет все между // и следующим : строка, которую вы хотите вставить.