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

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

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

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

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

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; 
  • первые пять символов
  • заменить запятую на определенное значение столбца
  • как я могу рассчитывать транзакции на основе даты и времени
  • преобразовать строку в столбец на основе определенного ключа
  • Количество слов из файла с оболочкой Linux
  • Как разделить stdout, чтобы перейти к нескольким выходным файлам?
  • Как удалить определенный символ после определенного слова
  • Выбирать и удалять строки, соответствующие шаблону из файла
  • Явный диапазон значений
  • как составить список строк из файла, где эти строки находятся в собственной строке
  • Как печатать один столбец для других столбцов комбинированный путь без awk?
  • голову, хвост, а затем линию?
  • Interesting Posts

    Символ Юникода в пароле

    Обновление CentOS 7 с использованием «yum update» не работает

    Как работает функция ACPI от DE?

    Создайте каталог с датой

    gcc создает ошибочный «Нет такого файла или каталога» под Cygwin

    Как предотвратить «Сообщения ядра были потеряны, так как система журнала не смогла обработать их достаточно быстро»?

    MailX не отправляет электронную почту при запуске в качестве службы Systemd

    Как слить ключи или обработать ключи с тем же именем?

    Работа с оператором if

    Как установить размер шрифта TTY вручную в Lubuntu?

    Как установить систему поверх ZFS?

    Получу ли я критические обновления безопасности, если я заблокирую CentOS yum для конкретной версии репо?

    Беспроводной контроллер Intel 8260 блокирует приостановку в ОЗУ в течение 10 секунд

    gdrive -bash: / usr / bin / drive: невозможно выполнить двоичный файл

    Получение пользовательского ввода во время работы в фоновом режиме

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