0

我有一个配置文件app.ini(背景是gitea,但这并不重要)

[log]
MODE      = file
LEVEL     = info

[server]
SSH_DOMAIN       = localhost
DOMAIN           = localhost
HTTP_PORT        = 3000

[mailer]
ENABLED = false

我想[server]通过 bash 命令在块的末尾添加多行(无需打开和编辑 app.ini)。如何在末尾添加内容很清楚(echo "xyz" >> app.ini)。

结果应该是这样的:

[log]
MODE      = file
LEVEL     = info

[server]
SSH_DOMAIN       = localhost
DOMAIN           = localhost
HTTP_PORT        = 3000
PROTOCOL = https
CERT_FILE = cert.pem
KEY_FILE = key.pem

[mailer]
ENABLED = false

在下面添加新行[server]也可以:

[server]
PROTOCOL = https
CERT_FILE = cert.pem
KEY_FILE = key.pem
...

提前致谢。

4

2 回答 2

2

edbash。

printf '%s\n' '/^\[server\]/,/^HTTP_PORT[[:space:]]*=.*/a' $'POROTOCOL = https\nCERT_FILE = cert.pem\nKEY_FILE = key.pem' . ,p Q | ed -s app.ini

或者您可以将多行字符串保存在单独的文件中,并创建一个ed包含以下代码的脚本。

H
/^\[server\]$/,/^HTTP_PORT[[:space:]]*=.*/r insert.txt
,p
Q
  • Whereinsert.txt包含要插入的字符串,并且script.ed是脚本。

然后

ed -s app.ini < script.ed 
  • 如果您认为输出正确,请更改为,以Q编辑wapp.ini

如果没有单独的配置文件,脚本看起来像这样。

H
/^\[server\]/,/^HTTP_PORT[[:space:]]*=.*/a                           
POROTOCOL = https
CERT_FILE = cert.pem
KEY_FILE = key.pem
.
,p
Q

然后针对文件调用脚本的相同语法。

ed -s app.ini < script.ed
于 2020-06-23T09:35:28.973 回答
1

纯 bash 版本:

#!/usr/bin/env bash

IFS+=$'\r' # Handle possible carriage returns
while read -r line; do
    printf "%s\n" "$line"
    test "$line" = "[server]" && cat << EOF
PROTOCOL         = https
CERT_FILE        = cert.pem
KEY_FILE         = key.pem
EOF
done < app.ini
于 2020-06-23T10:43:40.927 回答