Сед, чтобы заменить все строки в первом матче не работает - PullRequest
0 голосов
/ 26 февраля 2019

Вот файл, который я хочу отредактировать

server {    
listen      99;
listen      200;
listen      300;
server_name xxxx;
root        xxxx;
...

Я хочу изменить первую строку, содержащую «listen», на новые слова, такие как «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, почему он заменяет даже первую строкуЭто не соответствует моему образцу?

1 Ответ

0 голосов
/ 26 февраля 2019

Попробуйте:

$ 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.Таким образом, это соответствует первым двум строкам вашего файла примера.

s/.*/listen_xyz 40;/ - это команда substitute .Выполняется для любой строки в диапазоне.Любая строка (.*) заменяется на listen_xyz 40;.Это означает, что он заменяет server {, а также listen 99;.

Изменяя команду замены на s/listen.*/listen_xyz 40;/, мы гарантируем, что она заменяет только те строки, которые содержат listen.

...