Как я могу удалить все символы, попадающие под / * … * / includes / * & * /?

Я пробовал sed и awk, но его не работает как символ, который включает «/», который уже присутствует в команде как разделитель.

Пожалуйста, дайте мне знать, как я могу это достичь.

Ниже приведен пример примера. Мы хотим удалить прокомментированные разделы, т.е. /*.....*/

 /*This is to print the output data*/ proc print data=sashelp.cars; run; /*Creating dataset*/ data abc; set xyz; run; 

  • Как поменять местами два поля, разделенные обратной косой чертой, и вывести их, разделенные знаком?
  • голову, хвост, а затем линию?
  • заменить путь unix внутри файла
  • Удалить все, что не соответствует этому шаблону «something.swf» в txt-файле
  • вытягивать линии, которые содержат 1 в 3-й колонке
  • Unix / Linux - Заменить слова между круглыми скобками
  • Как объединить значения из двух столбцов?
  • Столбец Unix Truncate в файле csv
  • 7 Solutions collect form web for “Как я могу удалить все символы, попадающие под / * … * / includes / * & * /?”

    Я нашел легкое решение!

     cpp -P yourcommentedfile.txt 

    Я однажды придумал это, что мы можем уточнить:

     perl -0777 -pe ' BEGIN{ $bs=qr{(?:\\|\?\?/)}; $lc=qr{(?:$bs\n|$bs\r\n?)} } s{ /$lc*\*.*?\*$lc*/ | /$lc*/(?:$lc|[^\r\n])* | ( "(?:$bs$lc*.|.)*?" | '\''$lc*(?:$bs$lc*(?:\?\?.|.))?(?:\?\?.|.)*?'\'' | \?\?'\'' | .[^'\''"/?]* ) }{$1 eq "" ? " " : "$1"}exsg' . perl -0777 -pe ' BEGIN{ $bs=qr{(?:\\|\?\?/)}; $lc=qr{(?:$bs\n|$bs\r\n?)} } s{ /$lc*\*.*?\*$lc*/ | /$lc*/(?:$lc|[^\r\n])* | ( "(?:$bs$lc*.|.)*?" | '\''$lc*(?:$bs$lc*(?:\?\?.|.))?(?:\?\?.|.)*?'\'' | \?\?'\'' | .[^'\''"/?]* ) }{$1 eq "" ? " " : "$1"}exsg' 

    для обработки еще нескольких угловых случаев.

    Обратите внимание: если вы удалите комментарий, вы можете изменить значение кода ( 1-/* comment */-1 обрабатывается как 1 - -1 а 1--1 (который вы получите, если вы удалили комментарий) даст вам ошибку). Лучше заменить комментарий символом пробела (как мы здесь), а не полностью удалять его.

    Вышеприведенное должно работать должным образом над этим действующим кодом ANSI C, например, который пытается включить несколько угловых случаев:

     #include <stdio.h>
     int main ()
     {
       printf ("% d% s% c% c% c% c% c% s% s% d \ n",
       1 - / * комментарий * / - 1,
       / \
     * комментарий * /
       "/ * не комментарий * /",
       / * многострочный
       комментарий * /
       '' '/ * comment * /,' "',
       '\' ',' '' / * comment * /,
       «\
     \
     "', / * комментарий * /
       «\\
     "/ * не комментарий * /",
       "?? /" / * не комментарий * / ",
       '??' '+' "'/ *" комментарий "* /);
       return 0;
     }
    

    Что дает этот результат:

     #include <stdio.h>
     int main ()
     {
       printf ("% d% s% c% c% c% c% c% s% s% d \ n",
       1- -1,
    
       "/ * не комментарий * /",
    
       '' ',' '',
       '\' ',' '',
       «\
     \
     «»,  
       «\\
     "/ * не комментарий * /",
       "?? /" / * не комментарий * / ",
       '??' '+' "');
       return 0;
     }
    

    Оба печатают один и тот же вывод при компиляции и запуске.

    Вы можете сравнить с выходом gcc -ansi -E чтобы посмотреть, что на нем будет делать предварительный процессор. Этот код также является допустимым кодом C99 или C11, однако gcc отключает поддержку триггеров по умолчанию, поэтому он не будет работать с gcc если вы не укажете стандарт, например gcc -std=c99 или gcc -std=c11 или добавьте параметр -trigraphs ).

    Он также работает над этим кодом C99 / C11 (не ANSI / C90):

     // комментарий
     / \
     / комментарий
     // многострочный \
     комментарий
     "// не комментарий"
    

    (сравнить с gcc -E / gcc -std=c99 -E / gcc -std=c11 -E )

    ANSI C не поддерживал // form комментария. // иначе не действует в ANSI C, поэтому там не будет. Один надуманный случай, когда // может действительно отображаться в ANSI C (как отмечено там , и вы можете найти остальную часть обсуждения интересным), когда используется оператор stringify .

    Это действительный код ANSI C:

     #define s(x) #x s(//not a comment) 

    И во время обсуждения в 2004 году gcc -ansi -E действительно расширил его до "//not a comment" . Однако сегодня gcc-5.4 возвращает ошибку, поэтому я бы сомневался, что мы найдем много кода на C, используя эту конструкцию.

    Эквивалент GNU sed может быть примерно таким:

     lc='([\\%]\n|[\\%]\r\n?)' sed -zE " s/_/_u/g;s/!/_b/g;s/</_l/g;s/>/_r/g;s/:/_c/g;s/;/_s/g;s/@/_a/g;s/%/_p/g; s@\?\?/@%@g;s@/$lc*\*@:&@g;s@\*$lc*/@;&@g s:/$lc*/:@&:g;s/\?\?'/!/g s#:/$lc*\*[^;]*;\*$lc*/|@/$lc*/$lc*|(\"([\\\\%]$lc*.|[^\\\\%\"])*\"|'$lc*([\\\\%]$lc*.)?[^\\\\%']*'|[^'\"@;:]+)#<\5>#g s/<>/ /g;s/!/??'/g;s@%@??/@g;s/[<>@:;]//g s/_p/%/g;s/_a/@/g;s/_s/;/g;s/_c/:/g;s/_r/>/g;s/_l/</g;s/_b/!/g;s/_u/_/g" 

    Если ваш GNU- sed слишком старый для поддержки -E или -z , вы можете заменить первую строку:

     sed -r ":1;$!{N;b1} 

    с sed :

    ОБНОВИТЬ

     /\/\*/ { /\*\// { s/\/\*.*\*\///g; b next }; :loop; /\*\//! { N; b loop }; /\*\// { s/\/\*.*\*\//\n/g } :next } 

    поддерживать все возможные (многострочный комментарий, данные после [или и] до,);

      e1/*comment*/ ------------------- e1/*comment*/e2 ------------------- /*comment*/e2 ------------------- e1/*com ment*/ ------------------- e1/*com ment*/e2 ------------------- /*com ment*/e2 ------------------- e1/*com 1 2 ment*/ ------------------- e1/*com 1 2 ment*/e2 ------------------- /*com 1 2 ment*/e2 ------------------- 

    бег:

     $ sed -f command.sed FILENAME e1 ------------------- e1e2 ------------------- e2 ------------------- e1 ------------------- e1 e2 ------------------- e2 ------------------- e1 ------------------- e1 e2 ------------------- e2 ------------------- 
      $ cat file | perl -pe 'BEGIN{$/=undef}s!/\*.+?\*/!!sg' proc print data=sashelp.cars; run; data abc; set xyz; run; 

    Удалите пустые строки, если таковые имеются:

      $ cat file | perl -pe 'BEGIN{$/=undef}s!/\*.+?\*/\n?!!sg' 

    Редактировать – более короткая версия Стефана:

      $ cat file | perl -0777 -pe 's!/\*.*?\*/!!sg' 

    Решение с помощью команды SED и без скрипта

    Вот ты где:

    sed 's/\*\//\n&/g' test | sed '/\/\*/,/\*\//d'

    NB Это не работает в OS X, если вы не установите gnu-sed . Но он работает на Linux Distros.

    sed работает по одной строке за раз, но некоторые из комментариев во входном канале несколько строк. В соответствии с https://unix.stackexchange.com/a/152389/90751 , вы можете сначала использовать tr чтобы повернуть разрывы строк на другой символ. Затем sed может обрабатывать входные данные как одну строку, и вы снова используете tr для восстановления разрывов строк.

     tr '\n' '\0' | sed ... | tr '\0' \n' 

    Я использовал нулевые байты, но вы можете выбрать любой символ, который не отображается в вашем входном файле.

    * имеет особое значение в регулярных выражениях, поэтому ему потребуется экранирование как \* для соответствия литералу * .

    .* жадный – он будет соответствовать максимально длинному тексту, включая больше */ и /* . Это означает первый комментарий, последний комментарий и все, что между ними. Чтобы ограничить это, замените .* Более строгим шаблоном: комментарии могут содержать все, что не является «*», а также «*», за которым следует что-либо, что не является «/». Задания нескольких * s также должны учитываться:

     tr '\n' '\0' | sed -e 's,/\*\([^*]\|\*\+[^*/]\)*\*\+/,,g' | tr '\0' '\n' 

    Это приведет к удалению любых строк в многострочных комментариях, т. Е.

     data1 /* multiline comment */ data2 

    станет

     data1 data2 

    Если это не то, что нужно, sed можно сказать, чтобы сохранить один из линий. Это означает выбор символа замены строки, который можно сопоставить.

     tr '\n' '\f' | sed -e 's,/\*\(\(\f\)\|[^*]\|\*\+[^*/]\)*\*\+/,\2,g' | tr '\f' '\n' 

    Специальный символ \f и использование обратной ссылки, которая может не совпадать ни с чем, не гарантируют работу, как предполагалось, во всех реализациях sed . (Я подтвердил, что он работает с GNU sed 4.07 и 4.2.2.)

    используя одну строку sed для удаления комментариев:

     sed '/\/\*/d;/\*\//d' file proc print data=sashelp.cars; run; data abc; set xyz; run; 
    Interesting Posts

    hg log timezone форматирование

    Как напечатать следующий n-й столбец в текущей строке после соответствия шаблону?

    systemctl – активный выход неправильного состояния

    Изменить приглашение на основе значения

    Запуск двоичного файла ubuntu в CentOS с установленными всеми общими библиотеками приводит к ld SIGSEGV

    Как остановить скрипты bash от выхода из окна в целом

    Сохранять все команды в истории bash?

    Экран становится черным, в случайном порядке. * ОШИБКА * atombios застревает в исполнении C88E

    Как переместить раздел rc.conf HARDWARE в /etc/modules-load.d/?

    Создавать эскиз с видео в произвольный временной интервал

    как выйти из команды iostat на unix?

    Сервер Ubuntu со многими разделами

    Я SSH на сервер linux через putty, и у меня есть связанный диск на моей машине Windows. Как я могу получить доступ к файлам на других дисках?

    Старые компьютеры не стабильны с монетным двором 17

    Как настроить привязки привязок при запуске правильно в мире systemd?

    Linux и Unix - лучшая ОС в мире.