【问题标题】:Using sed to replace partial string by referenceing only beginning of the string使用 sed 通过仅引用字符串的开头来替换部分字符串
【发布时间】:2019-02-18 20:49:02
【问题描述】:

我在一个文件(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


【解决方案1】:

看看你想匹配哪些部分。

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

【讨论】:

  • 谢谢!!简直完美!! 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】:

你可以像这样使用sed

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

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

【讨论】:

  • 谢谢@hek2mgl。我已添加到问题中以澄清。
  • 我只知道它将以 /usr/lib/jvm/ 开头 - 所以你的命令对我不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 2014-03-07
  • 2011-02-07
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
相关资源
最近更新 更多