简体   繁体   English

sed + 用包含键和值的长文本替换文件中开头的键

[英]sed + replace key that begin in file with long text that include key and value

in kafka.properies filekafka.properies文件中

more /home/kafka.properies
log.retention.hours=12
delete.topic.enable=true
leader.imbalance.check.interval.seconds=300
leader.imbalance.per.broker.percentage=10
log.dir=/var/kafka/data1

we want to replace the我们想替换

log.dir=/var/kafka/data1

or any combination as或任何组合

log.dir=/var/kafka/data1,/var/kafka/data2, ...... 

with $line与 $line

when:什么时候:

echo $line
/var/kafka/data1,/var/kafka/data2,/var/kafka/data3,/var/kafka/data4,/var/kafka/data5,/var/kafka/data6,/var/kafka/data7,/var/kafka/data8

so we did the following:所以我们做了以下事情:

 sed "s/^log.dir.*/\$line/g"   /home/kafka.properies

or或者

sed 's/^log.dir.*/$line/g'   /home/kafka.properies

but we get但我们得到

log.retention.hours=12
delete.topic.enable=true
leader.imbalance.check.interval.seconds=300
leader.imbalance.per.broker.percentage=10
$line

instead to get而不是得到

log.retention.hours=12
delete.topic.enable=true
leader.imbalance.check.interval.seconds=300
leader.imbalance.per.broker.percentage=10
log.dir=/var/kafka/data1,/var/kafka/data2,/var/kafka/data3,/var/kafka/data4,/var/kafka/data5,/var/kafka/data6,/var/kafka/data7,/var/kafka/data8    
 

where I am wrong?我错在哪里? , what is the right approach for this replacing? ,这种替换的正确方法是什么? ( with sed or perl one liner or other ) (与 sed 或 perl 一个衬垫或其他)

You need to use你需要使用

sed "s~^log\.dir.*~log.dir=$line~" /home/kafka.properies

If there are any leading whitespaces, you may try如果有任何前导空格,您可以尝试

sed "s~^ *log\.dir.*~log.dir=$line~" /home/kafka.properies # only spaces
sed "s~^[[:space:]]*log\.dir.*~log.dir=$line~" /home/kafka.properies # any whitespaces
sed "s~^\s*log\.dir.*~log.dir=$line~" /home/kafka.properies # GNU sed only

See the online demo :查看在线演示

#!/bin/bash
s='log.retention.hours=12
delete.topic.enable=true
leader.imbalance.check.interval.seconds=300
leader.imbalance.per.broker.percentage=10
log.dir=/var/kafka/data1'
line='/var/kafka/data1,/var/kafka/data2,/var/kafka/data3,/var/kafka/data4,/var/kafka/data5,/var/kafka/data6,/var/kafka/data7,/var/kafka/data8'
sed "s~^log\.dir.*~log.dir=$line~g" <<< "$s"

Ouitput:输出:

log.retention.hours=12
delete.topic.enable=true
leader.imbalance.check.interval.seconds=300
leader.imbalance.per.broker.percentage=10
log.dir=/var/kafka/data1,/var/kafka/data2,/var/kafka/data3,/var/kafka/data4,/var/kafka/data5,/var/kafka/data6,/var/kafka/data7,/var/kafka/data8

Note:笔记:

  • ~ is used as a regex delimiter char here since the replacement contains / chars ~在这里用作正则表达式分隔符 char,因为替换包含/字符
  • . in log.dir must be escaped to match a literal . in log.dir必须转义以匹配文字. char, else, .字符,否则, . matches any single char匹配任何单个字符
  • You need to use double quotation marks in the sed command to be able to use variables in it.您需要在 sed 命令中使用双引号才能在其中使用变量。
  • Since you match log.dir and consume it, this text will be removed from the match, and you should put it back in the replacement pattern.由于您匹配log.dir并使用它,此文本将从匹配中删除,您应该将其放回替换模式中。

As an option, you can capture the log.dir and use the backreference/placeholder to the group value in the RHS:作为一个选项,您可以捕获log.dir并将反向引用/占位符用于 RHS 中的组值:

sed -E "s~^(log\.dir=).*~\1$line~" /home/kafka.properies

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM