Intereting Posts
Удалить конкретный столбец, если он существует в файле CSV Robolinux Live на микропрограмме Dell 5559 i7 6500U Почему служба SMTP работает по умолчанию после установки? Как создать и выполнить скрипт bash, который вызывает исполняемый файл из более высокой папки? Как установить время для входа в gdm в 24-часовой формат? Alienware M14x – Нет звука в linux Mint 14 (Nadia) " Имя источника данных не найдено, и драйвер по умолчанию не указан" при подключении к OracleDB с использованием ODBC установить раздел секций freebsd под linux Элементы управления Parentals? Внешнее предельное число используемых ядер процессора Извлечь начальные и конечные координаты в соответствии с определенной длиной нефиксированного интервала Как скопировать большие файлы по сети удаление строки из файла с помощью grep или sed, но количество строк все равно одинаково Сценарий Bash: элементы массива, содержащие пробельный символ Linux замедляется после длительного времени работы

Как удалить все комментарии из файла?

У меня есть файл с комментариями:

foo bar stuff #Do not show this... morestuff evenmorestuff#Or this 

Я просто хочу напечатать весь код без комментирования:

 foo bar stuff morestuff evenmorestuff 

Возможность снимать комментарии из файла настолько важна … Что это хороший способ сделать это?

Один из способов удалить все комментарии – использовать grep с опцией -o :

 grep -o '^[^#]*' file 

где

  • -o : печатает только согласованную часть строки
  • first ^ : начало строки
  • [^#]* : любой символ кроме # повторяется ноль или более раз

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

Я считаю, что sed может сделать гораздо лучше, чем grep . Что-то вроде этого:

 sed '/^[[:blank:]]*#/d;s/#.*//' your_file 

объяснение

  • sed по умолчанию будет искать ваш файл по строкам и печатать каждую строку после возможного применения преобразований в кавычках. ( sed '' your_file будет просто печатать все строки без изменений).
  • Здесь мы приводим команды sed для каждой строки (они разделены точкой с запятой).
  • Первая команда говорит: /^[[:blank:]]*#/d . На английском языке это означает, что если строка соответствует хешу в начале (которому предшествует любое количество ведущих пробелов), удалите эту строку (она не будет напечатана).
  • Вторая команда: s/#.*// . На английском языке, замените хэш-метку, за которой следует столько вещей, сколько вы можете найти (до конца строки, то есть) ни с чем (ничего не пустое пространство между последними двумя // ).
  • Таким образом, это будет проходить через ваш файл, удаляя строки, которые состоят полностью из комментариев, и любые строки, оставшиеся после этого, будут иметь комментарии, удаленные из них.

Вы можете использовать инверсное совпадение следующим образом:

  #grep -v "#" filename 

-v, -invert-match Инвертировать чувство соответствия, чтобы выбрать не соответствующие линии. (-v указан POSIX.)

Вы можете достичь требуемого результата с помощью команды sed. Команда ниже сделала трюк для меня.

 sed 's/#.*$//g' FileName 

где

  • #.*$ – Regexp будет фильтровать всю строку, начинающуюся с # до конца строки

Здесь нам нужно удалить эти строки, чтобы мы заменили на пустую, так что пропуская «замену».

  • g – упоминание повторного поиска шаблона до тех пор, пока не будет достигнут конец файла.

Общий синтаксис sed: s/regexp/replacement/flags FileName

 cat YOUR_FILE | cut -d'#' -f1 

Он использует # качестве разделителя столбцов и сохраняет только первый столбец (это все до # ).

Это сработало для меня

 sed -i.old -E "/^(#.*)$/d" file 

Мне нравится ответ на joseph, но он нужен, чтобы вырезать // комментарии, поэтому я немного изменил его и испытал на redhat

 # no comments alias alias nocom="sed -E '/^[[:blank:]]*(\/\/|#)/d;s/#.*//' | strings" # example cat SomeFile | nocom | less 

Бьюсь об заклад, есть лучший способ удалить пустые строки, чем использовать строки, но это было быстрое и грязное решение, которое я использовал.

-cheers

Используйте выражение типа

 egrep -v "#|$^" <file-name> 

: -v: будет инвертировать совпадение

: #: будет соответствовать всем строкам, начинающимся с #

: $ ^: будет соответствовать всем пустым строкам