Инструмент 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
разделителя полей!