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

Вы можете воспроизвести то, что ракушка делает под капотом, выполнив водопровод вручную. Если в вашей системе есть записи / dev / fd / NNN , вы можете использовать перетасовку файловых дескрипторов: вы можете преобразовать

main_command <(produce_arg1) <(produce_arg2) >(consume_arg3) >(consume_arg4)

в

{ produce_arg1 |
  { produce_arg2 |
    { main_command /dev/fd5 /dev/fd6 /dev/fd3 /dev/fd4 /dev/fd/9; } 5<&0 3>&1 |
    consume_arg3; } 6<&0 4>&1; |
  consume_arg4; } 8<&0 9>&1

. Я показал более сложный пример, чтобы проиллюстрировать несколько входов. и выходы. Если вам не нужно читать из стандартного ввода, и единственная причина, по которой вы используете подстановку процесса, заключается в том, что команде требуется явное имя файла, вы можете просто использовать / dev / stdin :

main_command <(produce_arg1)
produce_arg1 | main_command /dev/stdin

Без / dev / fd / NNN необходимо использовать именованный канал .Именованный канал - это запись в каталоге, поэтому вам нужно где-то создать временный файл, но этот файл является просто именем, он не содержит никаких данных.

tmp=$(mktemp -d)
mkfifo "$tmp/f1" "$tmp/f2" "$tmp/f3" "$tmp/f4"
produce_arg1 >"$tmp/f1" &
produce_arg2 >"$tmp/f2" &
consume_arg3 <"$tmp/f3" &
consume_arg4 <"$tmp/f4" &
main_command "$tmp/f1" "$tmp/f2" "$tmp/f3" "$tmp/f4"
rm -r "$tmp"

2
28.08.2017, 10:55
3 ответа

Просто напечатайте вторую следующую захваченную группу \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возможностях и даже короче.

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

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

5
27.01.2020, 21:51

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

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

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

0
27.01.2020, 21:51

Укороченныйsedподход:

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

Выход:

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

Теги

Похожие вопросы