我的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
如果我必须替换命令中的键值,例如:通过变量用Shell脚本的值替换键--server.address
的值,我该怎么做?
我了解,如果必须替换键--server.address的值,它将看起来像以下内容:
sed -i "s#--server.address=.* #$SERVER_ADDRESS#g;
但是,如何在替换后保持必须存在的空间,以及如何确保该部分仅在=
(等于)之后和(空格)之前插入int键被替换。
答案 0 :(得分:1)
您可以将此sed
与2个捕获组和反向引用一起使用:
val='10.0.0.1'
sed -E "s/^(.*--server.address=)[^[:blank:]]+(.*)$/\1$val\2/" file.properties
正则表达式:
^(.*--server.address=)
:匹配开始时的所有内容,直到--server.address=
子字符串并捕获到#1组中[^[:blank:]]*
:匹配0个或多个非空格字符(.*)$
:匹配所有内容并结束并在第2组中捕获替换:
\1
:向后引用捕获组#1 $val
:将所需的$val
替换
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 :(得分: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