【问题标题】:sed + replace key that begin in file with long text that include key and valuesed + 替换以包含键和值的长文本文件开头的键
【发布时间】:2022-01-18 13:50:15
【问题描述】:

在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~" (demo)
  • 我得到 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 (但没有“=”
  • 因为你没有加=。

标签: linux bash perl sed


【解决方案1】:

你需要使用

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 并使用反向引用/占位符来指向 RHS 中的组值:

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

【讨论】:

  • 顺便说一句,当 log.dir 以空格/s 开头时,您能否使用 sed 添加其他建议
  • @Judy 我在开头添加了。
  • 让我在我的 linux 机器上试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多