Вопрос или проблема
Внутри bash-скрипта мне нужна строка, которая будет искать эту конкретную строку (см. ниже), включая специальные символы, и удалять их. Есть идеи?
| CHANGED | rc=0 >>
Предполагая, что вы хотите удалить все вхождения строки " | CHANGED | rc=0 >>"
из содержимого файла, с помощью perl
:
perl -i -pe 's/\Q | CHANGED | rc=0 >>\E//g' file
С некоторыми реализациями sed
, включая GNU sed
, которые скопировали опцию -i
из perl
, вы также можете сделать:
sed -i 's/ | CHANGED | rc=0 >>//g' your-file
пробел, |
, >
(и в некоторых контекстах =
) являются специальными только для оболочки, когда они не заключены в кавычки.
|
является специальным в регулярных выражениях perl или расширенных регулярных выражениях (как с sed -E
), но не в основных регулярных выражениях (как с sed
без -E
/-r
/-P
/-A
…).
Чтобы экранировать символ, чтобы он потерял свое специальное значение в регулярном выражении, вы ставите перед ним \
, но вы не хотите делать это для символов, которые не имеют специального значения, так как это может на самом деле дать им специальное значение. Например, |
и >
не являются специальными в BRE, но \|
и \>
являются специальными для некоторых движков BRE, включая тот, который используется GNU sed
. Использование выражения в квадратных скобках — это другой способ сделать так, чтобы символ воспринимался буквально ([|]
соответствует буквальному |
во всех BRE, ERE, perl RE¹).
В perl
с помощью \Q...\E
все между \Q
и \E
воспринимается буквально, поэтому вам не нужно беспокоиться о символах, которые в противном случае были бы операторами регулярных выражений.
¹ Вы не можете использовать это для ^
, а для \
вам следует использовать [\\]
, [\]
является непортативным; у вас также будут проблемы с символом новой строки.
Ответ или решение
Удаление строк со специальными символами в Bash-скрипте
Если вам нужно удалить конкретную строку, содержащую специальные символы, в Bash-скрипте, существует несколько подходов с использованием утилит perl
и sed
. В данном контексте мы сосредоточимся на строке:
| CHANGED | rc=0 >>
Решение с использованием perl
Для удаления всех вхождений строки из файла с помощью perl
, можно воспользоваться следующим синтаксисом:
perl -i -pe 's/\Q | CHANGED | rc=0 >>\E//g файл
Пояснение:
-i
— параметр, который позволяет редактировать файл на месте.-p
— позволяет обрабатывать каждую строку файла, выводя её на стандартный вывод.s/.../.../g
— регулярное выражение для замены, гдеg
указывает на глобальную замену (все вхождения).\Q...\E
— позволяет экранировать специальные символы, чтобы они трактовались как обычные.
Решение с использованием sed
С другой стороны, если вы предпочитаете использовать sed
, для GNU sed
операция будет выглядеть следующим образом:
sed -i 's/ | CHANGED | rc=0 >>//g' ваш-файл
Пояснение:
-i
— также редактирует файл на месте.'s/.../.../g'
— аналогичное регулярное выражение для замены, как вperl
.
Особенности синтаксиса
В контексте регулярных выражений:
- Символ
|
в Perl считается специальным, а в базовых регулярных выраженияхsed
нет. Это значит, что его не нужно экранировать, если вы используете базовые регулярные выражения. - Символы
>
и=
не являются специальными вsed
. Однако в некоторых случаях экранирование может быть необходимо для других символов или окружений.
Рекомендуется обернуть символы, которые могут интерпретироваться как специальные с помощью \Q...\E
, чтобы избежать нежелательного поведения, что особенно актуально в случае использования perl
.
Заключение
Использование утилит perl
и sed
для удаления строк с специальными символами является эффективным методом обработки текстовых файлов в среде Bash. Выбор инструмента может зависеть от ваших конкретных предпочтений и требований к производительности. Если вам необходимо произвести более сложные манипуляции или обработку данных, perl
предоставит более гибкие возможности, в то время как sed
будет удобен для простых задач.