这是我要编辑的文件
server {
listen 99;
listen 200;
listen 300;
server_name xxxx;
root xxxx;
...
我想将包含“侦听”的第一行更改为新词,例如“ listen_xyz 40;”,这是我的代码:
sed -i -e '0,/listen/s/.*/listen_xyz 40;/' file
为什么它也替换第一行(与模式不匹配),所以我的文件现在看起来像这样:
listen_xyz 40;
listen_xyz 40;
listen 200;
listen 300;
server_name xxxx;
root xxxx;
...
我的sed代码有什么问题,为什么即使它不匹配我的模式,它仍替换第一行?
答案 0 :(得分:0)
尝试:
$ sed -e '0,/listen/ s/listen.*/listen_xyz 40;/' file
server {
listen_xyz 40;
listen 200;
listen 300;
server_name xxxx;
root xxxx;
...
0,/listen/
是一个范围。它匹配从文件开头到与正则表达式listen
匹配的第一行的所有行。因此,这与示例文件的前 2 行匹配。
s/.*/listen_xyz 40;/
是一个替代命令。对范围内的任何行执行。它用.*
替换任何行(listen_xyz 40;
)。这意味着它将替换server {
和listen 99;
。
通过将替换命令更改为s/listen.*/listen_xyz 40;/
,我们确保它仅替换包含listen
的行。