如何链接 sed 附加命令?

如何链接 sed 附加命令?

我想使用 SED 命令对配置文件应用更改,它需要在起始标记后的几个位置插入一些行。

然而,当我尝试过:

sed '/\[httpd/\]/a secure_rewrites = false; /\[couchdb/\]/adelayed_commits = false' local.ini

我发现,在 [httpd] 之后附加了一行:

secure_rewrites = false; [couchdb]/adelayed_commits=false

这显然不是我想要的。

是否可以链接附加命令?

答案1

作为 GNUsed a text子命令操作要添加的文本,该文本会被读取到行尾,您可以应用以下技巧(模仿换行符):

sed '/\[httpd\]/a secure_rewrites = false;
/\[couchdb\]/adelayed_commits = false' local.ini

示例输出:

...
[httpd]
secure_rewrites = false;
...
[couchdb]
delayed_commits = false

答案2

使用 GNU sed(BSDsed不会在添加的文本后添加换行符,除非您在添加的字符串中包含文字换行符):

sed -e '/\[httpd\]/a\'   -e 'secure_rewrites = false;' \
    -e '/\[couchdb\]/a\' -e 'delayed_commits = false;' local.ini

如果文件包含

[httpd]
[couchdb]

最初,上面的sed命令将产生

[httpd]
secure_rewrites = false;
[couchdb]
delayed_commits = false;

另请注意,a附加文本的命令应该写a\在附加文本的后面。 GNUsed允许省略\.


作为sed脚本(适用于任何sed):

/\[httpd\]/a\
secure_rewrites = false;
/\[couchdb\]/a\
delayed_commits = false;

这可以在命令行上用作文字单引号sed脚本字符串(换行符必须在最后一行之后),或者单独存储并输入sed使用

$ sed -f script.sed local.ini

#!/usr/bin/sed -f, 作为第一行(假设路径sed正确),甚至可以直接运行脚本:

$ ./script.sed local.ini

相关内容