Вы пытаетесь сопоставить шаблон, который занимает несколько строк. sed
пытается сопоставить регулярное выражение для каждой строки. Попробуйте использовать отдельный шаблон для каждой строки:
sed 's/^ data:/ # data:/;s/^ driver: test/ # driver: test/' test.txt
Есть две команды s
, разделенные точкой с запятой ;
. Кажется, вам нужно указать определенное количество пробелов (2 для строки data
, 4 для driver
), поэтому я оставил это значение тем же. Обратите внимание на использование ^
для привязки регулярного выражения к началу строки.
Предположим, ваш входной файл test.txt теперь:
volumes:
data:
driver: test
volumes:
data:
driver: test
Чтобы заменить только первое вхождение шаблона driver: test
(но все вхождения шаблона data:
), попробуйте что-то вроде:
sed 's/^ data:/ # data:/;0,/^ driver: test/s// # driver: test/' test.txt
Это будет работать только с GNU sed . Результат:
volumes:
# data:
# driver: test
volumes:
# data:
driver: test
Чтобы соответствовать первому вхождению обоих, попробуйте
sed '0,/^ data:/s// # data:/;0,/^ driver: test/s// # driver: test/' test.txt
, что дает
volumes:
# data:
# driver: test
volumes:
data:
driver: test
См. Также Как использовать sed для замены только первого вхождения в файле?