首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed +替换文件中以包含键和值的长文本开头的键

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

Stack Overflow用户
提问于 2022-01-18 13:50:15
回答 1查看 66关注 0票数 1

kafka.properies文件中

代码语言:javascript
复制
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

我们想要替换

代码语言:javascript
复制
log.dir=/var/kafka/data1

或任何组合

代码语言:javascript
复制
log.dir=/var/kafka/data1,/var/kafka/data2, ...... 

用$line

当:

代码语言:javascript
复制
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

因此,我们做了以下工作:

代码语言:javascript
复制
 sed "s/^log.dir.*/\$line/g"   /home/kafka.properies

代码语言:javascript
复制
sed 's/^log.dir.*/$line/g'   /home/kafka.properies

但我们得到了

代码语言:javascript
复制
log.retention.hours=12
delete.topic.enable=true
leader.imbalance.check.interval.seconds=300
leader.imbalance.per.broker.percentage=10
$line

取而代之的是

代码语言:javascript
复制
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一行或其他)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-18 13:55:49

你需要用

代码语言:javascript
复制
sed "s~^log\.dir.*~log.dir=$line~" /home/kafka.properies

如果有任何领先的空白空间,您可以尝试

代码语言:javascript
复制
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

在线演示

代码语言:javascript
复制
#!/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:

代码语言:javascript
复制
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

注意:

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

作为一个选项,您可以捕获log.dir并对RHS中的组值使用反向引用/占位符:

代码语言:javascript
复制
sed -E "s~^(log\.dir=).*~\1$line~" /home/kafka.properies
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70756664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档