2017-02-16 15 views
1

Я пытаюсь написать сценарий sed, который заменяет часть строки, но только на строках, в которых нет знака «$».Скрипт Sed, который соответствует строкам, содержащим строку, но не включает в себя другую строку

Например, файл может выглядеть

host=$myvar 
param1=val1 
param2=val2 
host=abc 
host=def 

Я хочу, чтобы заменить «хост = ABC» и «хост = DEF» с «хост = ZZZZZ» и игнорировать «хост = $ MyVar» , Таким образом, конечный результат должен выглядеть так:

host=$myvar 
param1=val1 
param2=val2 
host=zzzzz 
host=zzzzz 

Я пробовал несколько выражений регулярных выражений, но они не сработали.

ответ

1

Вот один из способов, используя шаблон адрес:

sed '/\$/!s/^\(host=\).*/\1zzzz/' file 

Результаты:

host=$myvar 
param1=val1 
param2=val2 
host=zzzz 
host=zzzz 
+0

Почему в 2-х операциях, когда одна подстановка может позаботиться об этом, используйте '^ \ (host = \) [^ $] *' (см. Мой ответ ниже) – anubhava

0

Используйте это регулярное выражение:

^host=([^\$].*?)$ 
  • Для этого примера, вы должны использовать флаг многострочного /m или пройти через это построчно. Он использует ^ и $, чтобы указать начало/конец строки
  • [^\$] требует характер, который отличается от $

Вот живой пример: https://regex101.com/r/8w6er9/2


Если вы не можете перейдите по строкам, вы также можете использовать это регулярное выражение:

(?:^|\r?\n)host=([^\$].*?)(?:\r?\n|$) 
0

Вы можете использовать эту sed команду для этого:

sed -E 's/^(host=)[^$]+$/\1zzzzz/' file 

host=$myvar 
param1=val1 
param2=val2 
host=zzzzz 
host=zzzzz 

[^$]+ является инвертированный символьный класс, который соответствует 1 или более любого символа, который не $