Команда c\
удаляет все строки между первым совпадающим адресом и вторым совпадающим адресом включительно, когда используется с 2 адресами, и распечатывает текст, указанный после c\
при сопоставлении второй адрес. Если во входных данных нет строки, соответствующей второму адресу, он просто удаляет все строки (включительно) между первым совпадающим адресом и последней строкой. Поскольку вы хотите заменить только одну строку, вам не следует использовать команду c\
для диапазона адресов. При нормальном использовании за c\
сразу следует символ новой строки. Диапазон адресов 0,/regexp/
является расширением GNU sed
, которое также будет пытаться сопоставить regexp
в первой строке ввода, что отличается от 1,/regexp/
в этом аспекте. Итак, правильная команда в GNU sed
может быть
sed '0,/something/{/something/c\
COMPLETE NEW LINE
}' < in.txt
или упрощена, как указано Sundeep
sed '0,/something/{//c\
COMPLETE NEW LINE
}' < in.txt
, или однострочным,
sed -e '0,/something/{//cCOMPLETE NEW LINE' -e '}' < in.txt
, если буквальный символ новой строки нежелателен.
Этот однострочник также работает, как указано potong:
sed '0,/something/!b;//cCOMPLETE NEW LINE' in.txt