我们有以下配置文件
more /tmp/file
delete.topic.enable=true
broker.id=-1
advertised.listeners=null
.
.
.
我们需要将上面的所有语法转换如下:
- 将“=”分隔符之前的字符更改为大写字符
- 添加
KAFKA_
到每行的开头 - 替换每个点“.”到“_”下一行,直到“=”分隔符
预期结果示例
KAFKA_DELETE_TOPIC_ENABLE=true
KAFKA_BROKER_ID=-1
KAFKA_ADVERTISED_LISTENERS=null
.
.
.
sed对此改变有什么建议吗?
我们试试这个,
KAFKA_
但这也会在“=”分隔符之后转换承租人(不应该是这样),而且我们也不知道如何在开头添加
sed 's/[a-z]/\U&/g' /tmp/file | sed s'/\./_/g'
DELETE_TOPIC_ENABLE=TRUE
BROKER_ID=-1
ADVERTISED_LISTENERS=NULL
.
.
答案1
使用 GNU awk 将第三个参数匹配到 match():
$ awk 'match($0,/([^=]+)(.*)/,a){ gsub(/\./,"_",a[1]); print "KAFKA_" toupper(a[1]) a[2]}' file
KAFKA_DELETE_TOPIC_ENABLE=true
KAFKA_BROKER_ID=-1
KAFKA_ADVERTISED_LISTENERS=null
对于任何 awk:
$ awk 'match($0,/[^=]+/){ tag=substr($0,1,RLENGTH); gsub(/\./,"_",tag); print "KAFKA_" toupper(tag) substr($0,1+RLENGTH)}' file
KAFKA_DELETE_TOPIC_ENABLE=true
KAFKA_BROKER_ID=-1
KAFKA_ADVERTISED_LISTENERS=null
答案2
awk -F "=" 'OFS="="{gsub(/\./,"_",$1);print "KAFKA_"toupper($1)"="$2}' FILE
输出
KAFKA_DELETE_TOPIC_ENABLE=true
KAFKA_BROKER_ID=-1
KAFKA_ADVERTISED_LISTENERS=nul1
Python
#!/usr/bin/python
import re
k=open('file1','r')
for i in k:
y=i.split('=')
z=y[0].upper().replace(".","_")+"="+y[1]
print "KAFKA_{0}".format(z).strip()
输出
KAFKA_DELETE_TOPIC_ENABLE=true
KAFKA_BROKER_ID=-1
KAFKA_ADVERTISED_LISTENERS=null
答案3
perl
单行:
perl -pe 's/^([^=]+)/KAFKA_\U$1/; s/\.(?=[^=]*=)/_/g' file