使用sed替换shell脚本中的值

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

我的shell脚本如下所示:

FAILED_REQUEST_DIRECTORY=/bla/bla2 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1234  -jar /xyz/abc-service-1.0-SNAPSHOT.jar --server.port=1111 --server.address=127.0.0.1 --kafka.bootstrap.servers=10.111.11.11:3197,10.112.12.111:3197,10.123.44.25:3197 --topic.pushcrew.encryptionKey=abc-def-egh --spring.application.name=name-sevice  --fb.verification.token=token --management.trace.include.payload=true --topic.pushcrew.hits=activity-logs --max.block.ms=1000 --pager.duty.api.key=apikey --dsn=dsn

如果我必须替换命令中的键值,例如:通过变量将key --server.address的值替换为shell脚本的值,我该怎么做?

我知道如果我必须替换key --server.address的值,它将会像下面一样:

sed -i "s#--server.address=.* #$SERVER_ADDRESS#g;

但是如何在替换之后保持必须存在的空间,以及如何在=(等于)之后和(空格)被替换之前确保该部分在键中。

shell awk sed
2个回答
1
投票

您可以将此sed与2个捕获组和反向引用一起使用:

val='10.0.0.1'

sed -E "s/^(.*--server.address=)[^[:blank:]]+(.*)$/\1$val\2/" file.properties

Details:

正则表达式:

  • ^(.*--server.address=):在开始时匹配所有内容,直到--server.address=子串并在组#1中捕获
  • [^[:blank:]]*:匹配0个或更多非空格字符
  • (.*)$:匹配所有内容直到和结束并在第2组中捕获

替换:

  • \1:对捕获组#1的反向引用
  • $val:替换所需的$val
  • `\ 2:对捕获组#2的反向引用

FAILED_REQUEST_DIRECTORY=/bla/bla2 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1234 -jar /xyz/abc-service-1.0-SNAPSHOT.jar --server.port=1111 --server.address=10.0.0.1 --kafka.bootstrap.servers=10.111.11.11:3197,10.112.12.111:3197,10.123.44.25:3197 --topic.pushcrew.encryptionKey=abc-def-egh --spring.application.name=name-sevice --fb.verification.token=token --management.trace.include.payload=true --topic.pushcrew.hits=activity-logs --max.block.ms=1000 --pager.duty.api.key=apikey --dsn=dsn


1
投票

如果你对awk没问题,可以试试下面。(将输出保存到Input_file本身,将> temp_file && mv temp_file Input_file添加到下面的代码中)

val='10.0.0.1'
awk -v var="$val" '
match($0,/--server\.address=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){
  val=substr($0,RSTART,RLENGTH)
  sub(/=.*/,"="var,val)
  print substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
  next
}
1
'   Input_file

输出如下。

FAILED_REQUEST_DIRECTORY=/bla/bla2 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1234  -jar /xyz/abc-service-1.0-SNAPSHOT.jar --server.port=1111 --server.address=10.0.0.1 --kafka.bootstrap.servers=10.111.11.11:3197,10.112.12.111:3197,10.123.44.25:3197 --topic.pushcrew.encryptionKey=abc-def-egh --spring.application.name=name-sevice  --fb.verification.token=token --management.trace.include.payload=true --topic.pushcrew.hits=activity-logs --max.block.ms=1000 --pager.duty.api.key=apikey --dsn=dsn
© www.soinside.com 2019 - 2024. All rights reserved.