繁体   English   中英

bash/sed - 在文件的特定位置添加多行

[英]bash/sed - adding multiple lines at specific location in file

我想自动将新后端添加到配置文件中,但不知道该怎么做。 文件的相关部分如下所示:

[backend]
backends = backend-1 backend-2
timeout = 10
connectionsperhost = 100

[backend-1]
url = https://somedomain.com
secret = 6135bcb7849ca1886e2de193

[backend-2]
url = https://anotherdomain.com
secret = 75048ad646a5af787cbbaaa3 

我正在寻找一个简单的解决方案来添加另一个具有特定 url 和秘密的后端条目。

[backend-3]
url = https://adiffrentdomain.com
secret = 42349234238423424

同时 append 将名称“backend-3”添加到“[backend]”部分的“backends =”行。

有没有办法让这个工作与 sed 或 bash 脚本一起工作?

请感谢任何帮助或提示!

您可以尝试使用awk的方法。 它向以 backends 开头的行添加一个backends条目,并在文件末尾附加一个带有给定信息的[backend-x]部分。
显然,它依赖于后端的条目是否正确,因为它不单独计算[backend]部分。

url="www.domain.com"
s=9283283h4923h42934

% awk -v url=$url -v s=$s '/^backends/{x=NF-1; $0=$0" backend-"x} 
    {print} 
    END{ print "\n[backend-"x"]\nurl = "url"\nsecret = "s }' file
[backend]
backends = backend-1 backend-2 backend-3
timeout = 10
connectionsperhost = 100

[backend-1]
url = https://somedomain.com
secret = 6135bcb7849ca1886e2de193

[backend-2]
url = https://anotherdomain.com
secret = 75048ad646a5af787cbbaaa3 

[backend-3]
url = www.domain.com
secret = 9283283h4923h42934

数据

cat file
[backend]
backends = backend-1 backend-2
timeout = 10
connectionsperhost = 100

[backend-1]
url = https://somedomain.com
secret = 6135bcb7849ca1886e2de193

[backend-2]
url = https://anotherdomain.com
secret = 75048ad646a5af787cbbaaa3 

使用sed

$ sed '/backends =/s/$/ backend-3/;/^\[backend-2/{N;N;s|secret.*|&\n\n[backend-3] \
url = https://adifferentdomain.com \
secret = 42349234238423424|}' input_file
[backend]
backends = backend-1 backend-2 backend-3
timeout = 10
connectionsperhost = 100

[backend-1]
url = https://somedomain.com
secret = 6135bcb7849ca1886e2de193

[backend-2]
url = https://anotherdomain.com
secret = 75048ad646a5af787cbbaaa3

[backend-3]
url = https://adiffrentdomain.com
secret = 42349234238423424

如果输入来自变量,您可能希望使用双引号来扩展变量。 例如;

sed "/backends =/s/$/ backend-3/;$a\\n[backend-3] \
url = $url_input \
secret = $secret_input" input_file

对于带有awkurlsecret的任意新后端条目, newbackendname是唯一提供的输入。 只需将新后端添加到backends = -list 和直接在通用[backend] -block 之后的相应块。

awk -vnewentry="newbackendname" -vurl="http://new.url" -vsecret="secret123" '
  #in backends= line: add new entry (at first position)
  #and set `add` marker
  /^backends =/{sub(/^backends = /,"&"newentry" ",$0) ; add=1}
  #marker exists and empty line (end of header block) is found:
  #print new entry and unset marker `add`
  add && /^$/{ print "\n["newentry"]"
               print "url = "url
               print "secret = "secret
               add=0}
  #print by default
  1' infile.txt

希望评论能让您轻松理解。 With this code, you may as well just add url and secret via shell variables as awk -vurl="$URL" -vsecret="$SECRET" -vnewentry="$NEWBACKEND" '...' infile.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM