Інструмент POSIX для сценаріїв редагування файлу (а не друку модифікованого вмісту для стандартного виходу) є ex
.
printf '%s\n' 'g/^[^C]*C[^C]*$/d' x | ex file.txt
Звичайно, ви можете використовувати,sed -i
якщо ваша версія Sed підтримує її, просто пам’ятайте, що це не портативно, якщо ви пишете сценарій, який призначений для роботи в різних типах систем.
Девід Фоерстер запитав у коментарях:
Чи є причина, чому ви використовуєте, printf
а ні, echo
чи щось подібне ex -c COMMAND
?
Відповідь: Так.
Для printf
vs. echo
це питання переносимості; див. Чому printf кращий за відлуння? А також легше перемежувати нові рядки між командами, використовуючи printf
.
Для printf ... | ex
vs. 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
Перший буде висіти і чекати введення; другий вийде, коли ex
команда отримає EOF , тому сценарій продовжиться. Існують альтернативні способи вирішення, наприклад s///e
, але вони не визначені POSIX. Я вважаю за краще використовувати портативну форму, яка показана вище.
Для g
команди в кінці повинен бути новий рядок, і я вважаю за краще використовувати printf
команду, щоб обернути команди, а не вставляти новий рядок в єдині лапки.
awk
роздільника поля!