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

问题描述 投票:0回答:2

我在文件中有两行(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') 
shell unix command-line text-processing
2个回答
0
投票

看看你想要匹配的部分。

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

0
投票

你可以像这样使用sed

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

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

© www.soinside.com 2019 - 2024. All rights reserved.