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
在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
注:
~
在这里用作正则表达式分隔符字符,因为替换包含/
个字符.
必须转义以匹配文字.
字符,否则,.
匹配任何单个字符- 您需要在 sed 命令中使用双引号才能在其中使用变量。
- 由于您匹配
log.dir
并使用它,此文本将从匹配中删除,您应该将其放回替换模式中。
log.dir
中的 作为一个选项,您可以捕获 log.dir
并将 backreference/placeholder 用于 RHS 中的组值:
sed -E "s~^(log\.dir=).*~$line~" /home/kafka.properies