Инструмент POSIX для редактирования файла по сценарию (вместо печати измененного содержимого в стандартный формат) ex.
printf '%s\n' 'g/^[^C]*C[^C]*$/d' x | ex file.txt
Конечно, вы можете использовать,sed -i если ваша версия Sed поддерживает это, просто имейте в виду, что это не переносимо, если вы пишете сценарий, предназначенный для запуска в разных типах систем.
Дэвид Фёрстер спросил в комментариях:
Есть ли причина, почему вы используете, printfа не echoили что-то подобное ex -c COMMAND?
Ответ: да.
Для printfпротив echoэто вопрос переносимости; Посмотрите, почему printf лучше, чем echo? И также легче перемежать переводы строк между командами, использующими printf.
Для printf ... | exпротив ex -c ..., это вопрос обработки ошибок. Для этой конкретной команды это не имеет значения, но в целом это имеет значение; например, попробуйте положить
ex -c '%s/this pattern is not in the file/replacement text/g | x' filename
в сценарии. Сравните это со следующим:
printf '%s\n' '%s/no matching lines/replacement/g' x | ex file
Первый будет зависать и ждать ввода; второй завершится, когда команда получит EOF ex, поэтому сценарий продолжится. Существуют альтернативные обходные пути, например s///e, но они не указаны в POSIX. Я предпочитаю использовать переносную форму, которая показана выше.
Для gкоманды в конце должен быть символ новой строки, и я предпочитаю использовать printfдля переноса команд, а не вставлять новую строку в одинарные кавычки.
awkразделителя полей!