[英]sed + replace key that begin in file with long text that include key and value
in kafka.properies
file在
kafka.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 .
log.dir
必须转义以匹配文字.
char, else, .
.
matches any single charlog.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.