Вы можете воспроизвести то, что ракушка делает под капотом, выполнив водопровод вручную. Если в вашей системе есть записи / 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
(я не изменяю и не улучшаю ваш 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-адрес.
Короткое sed
решение без обмана:
$ sed 's#//[^:]*#//zizi#' file
database.url=jdbc:mysql://zizi:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
Это заменяет все между //
и следующим за ним :
на строку, которую вы хотели вставить.
Укороченныйsedподход:
sed 's~\(.*mysql://\)[^:]*~\1zizi~' file
Выход:
database.url=jdbc:mysql://zizi:mySqlPort/mySqlDbName?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull