Использование sed для замены частичной строки, ссылаясь только на начало строки - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть две строки в файле (file.sh):

gc=$(sudo /usr/lib/jvm/java-8-openjdk-amd64/bin/jstat -gc $pid | tail -1 | sed -e 's/[ ][ ]*/ /g')

gccapacity=$(sudo /usr/lib/jvm/java-8-openjdk-amd64/bin/jstat -gccapacity $pid | tail -1 | sed -e 's/[ ][ ]*/ /g')

Используя командную строку, я хочу заменить пути, оставив остаток в такте.Я хочу заменить путь с помощью '$ JAVA_HOME' bin / jstat

Я бы хотел, чтобы результаты были:

gc=$(sudo /usr/lib/jvm/java-9-openjdk-amd64/bin/jstat -gc $pid | tail -1 | sed -e 's/[ ][ ]*/ /g')

gccapacity=$(sudo /usr/lib/jvm/java-9-openjdk-amd64/bin/jstat -gccapacity $pid | tail -1 | sed -e 's/[ ][ ]*/ /g')

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

/usr/lib/jvm/

Редактировать: спасибо @ Walter-a

**ubuntu@ubuntu:~$** echo $JAVA_HOME  
/usr/lib/jvm/java-11-oracle 


**ubuntu@ubuntu:~$** cat test.sh  
gc=$(sudo /usr/lib/jvm/java-9-openjdk-amd64/bin/jstat -gc $pid | tail -1 | sed -e 's/[ ][ ]*/ /g') 


**ubuntu@ubuntu:~$** sed -r "s#(sudo ).*(/bin/jstat)#\1${JAVA_HOME}\2#" test.sh  
gc=$(sudo /usr/lib/jvm/java-11-oracle/bin/jstat -gc $pid | tail -1 | sed -e 's/[ ][ ]*/ /g') 

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Посмотрите, какие части вы хотите соответствовать.

sed -r "s#(sudo /usr/lib/jvm/).*(/bin/jstat)#\1${JAVA_HOME}\2#" file.sh
0 голосов
/ 18 февраля 2019

Вы можете использовать sed следующим образом:

sed "s#/usr/lib/jvm/java[^/]*/#/\"${JAVA_HOME}\"#g" file.sh

Я использую # в качестве разделителя для команды s, потому что / является частью регулярного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...