我想使用 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