Игнорируйте комментарии C и включайте выражения, используя sed (//, / **, ** /, #) - PullRequest
0 голосов
/ 30 сентября 2018

Итак, у меня есть пример кода C

/**
example text
**/
#include <stdio.h>

int main(){
    int example = 0;
    // example text
    return;
}

Как бы я конкретно использовал sed, чтобы игнорировать все строки, начинающиеся с // или #, а также игнорируя строки в диапазоне/** до **/?Я пробовал что-то вроде sed -E '/(^#|\/\*/,/\*\/|^\/\/)/!s/example/EXAMPLE/g', но у меня есть ощущение, что я не использую | правильно, так как появляется сообщение об ошибке «unmatched (»

Мой желаемый конечный результат должен быть

/**
example text
**/
#include <stdio.h>

int main(){
    int EXAMPLE = 0;
    // example text
    return;
}

Изменение команды sed привело бы к замене экземпляров слова «пример» в программе на версию «EXAMPLE» в верхнем регистре, и я пытаюсь сделать так, чтобы слова в комментариях были зарезервированы.не меняются.

1 Ответ

0 голосов
/ 30 сентября 2018

Не забывая о возможности попасть в обстоятельства, которые 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.

Ваша попытка не работает, потому что вы пытаетесь использовать логическое ИЛИ | в комбинации паттернов, таких как # или //, а также в диапазоне, таком как /\/\*\*/,/\*\*\//

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...