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

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

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

我们要替换

log.dir=/var/kafka/data1

的任何组合
log.dir=/var/kafka/data1,/var/kafka/data2, ...... 

与 $line

时间:

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

所以我们做了以下事情:

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

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

但我们得到

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

而不是得到

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    
 

我哪里错了? ,这种替换的正确方法是什么? (使用 sed 或 perl 一个班轮或其他)

你需要使用

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

如果有任何前导空格,您可以尝试

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

参见 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"

输出:

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

注:

  • ~ 在这里用作正则表达式分隔符字符,因为替换包含 / 个字符
  • log.dir 中的
  • . 必须转义以匹配文字 . 字符,否则,. 匹配任何单个字符
  • 您需要在 sed 命令中使用双引号才能在其中使用变量。
  • 由于您匹配 log.dir 并使用它,此文本将从匹配中删除,您应该将其放回替换模式中。

作为一个选项,您可以捕获 log.dir 并将 backreference/placeholder 用于 RHS 中的组值:

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