Не забывая о возможности попасть в обстоятельства, которые sed
не будут подходящим инструментом для этой работы, о чем говорится в комментариях о грехе и мельпомене, нижеприведенная команда поможет вам в вашем конкретном упражнении:
sed -E '/(#|\/\/)/b ; /\/\*\*/,/\*\*\//b; s/example/EXAMPLE/g' file
/**
example text
**/
#include <stdio.h> example
int main(){
int EXAMPLE = 0;
// example text
return;
}
sed
специальное слово b
использует метки:
'b LABEL'
Безоговорочно переходите к LABEL.LABEL может быть опущен, и в этом случае начинается следующий цикл.
Другими словами, вместо отрицания шаблона, подобного /pattern/!
, вы можете использовать /pattern/b
без метки, а когда /pattern/
Обнаружено, что sed переходит (из-за b
) к следующему циклу, пропуская команду подстановки s/example/EXAMPLE/g
.
Ваша попытка не работает, потому что вы пытаетесь использовать логическое ИЛИ |
в комбинации паттернов, таких как #
или //
, а также в диапазоне, таком как /\/\*\*/,/\*\*\//