通过仅引用字符串的开头使用sed替换部分字符串

时间:2019-02-18 20:49:02

标签: shell unix command-line text-processing

我在文件(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 :(得分:0)

您可以像这样使用sed

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

我将#用作s命令的定界符,因为/是正则表达式的一部分。

答案 1 :(得分:0)

查看要匹配的部分。

sed -r "s#(sudo /usr/lib/jvm/).*(/bin/jstat)#\1${JAVA_HOME}\2#" file.sh