首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash/sed -在文件中的特定位置添加多行

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

Stack Overflow用户
提问于 2022-01-12 13:32:58
回答 3查看 83关注 0票数 -1

我想自动向配置文件中添加新的后端,但不知道如何做到这一点。文件的相关部分如下所示:

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

我正在寻找一个简单的解决方案,以添加另一个带有特定网址和秘密的后端条目。

代码语言:javascript
复制
[backend-3]
url = https://adiffrentdomain.com
secret = 42349234238423424

同时,将“后端-3”的名称附加到“后端”部分的“后端=”行中。

是否有一种方法可以使这个工作与sed或bash脚本通用?

谢谢您的帮助或提示!

EN

回答 3

Stack Overflow用户

发布于 2022-01-12 14:26:17

您可以使用awk尝试一种方法。它将一个后端条目添加到以后端开始的行中,并在后端块的最后一行之后(在connectionsperhost之后)附加一个带有给定信息的后端-x部分。

显然,它依赖于后端的条目是正确的,因为它不单独计算后端部分。

代码语言:javascript
复制
url="www.domain.com"
s=9283283h4923h42934

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

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

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

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

数据

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

Stack Overflow用户

发布于 2022-01-12 14:29:41

使用sed

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

如果输入来自变量,则需要使用双引号来展开变量。例如;

代码语言:javascript
复制
sed "/backends =/s/$/ backend-3/;$a\\n[backend-3] \
url = $url_input \
secret = $secret_input" input_file
票数 0
EN

Stack Overflow用户

发布于 2022-01-12 15:03:22

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

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

希望这些评论能使我们更容易理解。使用这段代码,您可以通过shell变量添加url和awk -vurl="$URL" -vsecret="$SECRET" -vnewentry="$NEWBACKEND" '...' infile.txt

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70682459

复制
相关文章

相似问题

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