如何改进Sed命令,支持文件无对应键时自动添加键值对?
改进Sed命令实现键值对替换与缺失时的自动添加
原有Sed命令:
sed -i "/num.replica.fetchers/s/=.*$/=$num_cpu/" kafka.configuration
仅能在文件中存在num.replica.fetchers = XX时替换等号后的数值,若该键值对不存在则无任何操作。以下是两种改进方案,满足存在则替换,不存在则在#section A行后添加的需求:
方案一:单Sed命令完成
sed -i -e "/num.replica.fetchers/s/=.*$/=$num_cpu/" -e "/#section A/{n;/num.replica.fetchers/!i num.replica.fetchers = $num_cpu}" kafka.configuration
命令拆解:
-e "/num.replica.fetchers/s/=.*$/=$num_cpu/":保留原有替换逻辑,匹配到目标键值对时,将等号后的内容替换为$num_cpu。-e "/#section A/{n;/num.replica.fetchers/!i num.replica.fetchers = $num_cpu}":- 匹配到
#section A行后,执行n命令跳转到下一行; - 检查下一行是否包含
num.replica.fetchers,如果不包含,就用i命令在#section A的下一行插入指定键值对。
- 匹配到
方案二:Grep+Sed组合(更稳妥,避免重复添加)
如果担心多次执行命令导致重复插入键值对,可先用Grep检查文件中是否存在目标键,再决定是否添加:
# 检查目标键是否存在,不存在则在#section A后追加 grep -q "num.replica.fetchers" kafka.configuration || sed -i "/#section A/a num.replica.fetchers = $num_cpu" kafka.configuration # 统一替换目标键的数值 sed -i "/num.replica.fetchers/s/=.*$/=$num_cpu/" kafka.configuration
命令拆解:
grep -q "num.replica.fetchers" kafka.configuration:静默模式检查文件,存在目标键返回0,不存在返回非0;|| sed -i "/#section A/a ...":仅当Grep检测到目标键不存在时,执行Sed在#section A行后追加键值对;- 最后执行替换命令,确保无论键是原有还是刚添加的,数值都被设置为
$num_cpu。
内容的提问来源于stack exchange,提问作者Judy
相关产品推荐
相关产品推荐

