У меня есть файл с комментариями:
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
Я просто хочу напечатать весь некомментированный код:
foo
bar
stuff
morestuff
evenmorestuff
Возможность извлечения комментариев из файла очень важна ... Какой хороший способ сделать это?
shell-script
text-processing
awk
sed
grep
Вопросительный знак
источник
источник
awk -F\# '$1!="" { print $1 ;} '
.echo '#' # output a #
обрабатываться такая строка ?Ответы:
Один из способов , чтобы удалить все комментарии заключается в использовании
grep
с-o
опцией:где
-o
: печатает только совпадающую часть строки^
: начало строки[^#]*
: любой символ, кроме#
повторяющегося ноля или более разОбратите внимание, что пустые строки тоже будут удалены, но останутся только строки с пробелами.
источник
grep -v '^#' file > newfilewithoutcomments
somvar='I am a long complicated string ## with special characters' # and I am a comment
не будет обрабатываться правильно.grep -o '^[^#].*' file
sed
Решение имеет только одну пустую строку, кажется твердым аргументом для использования другого ответа, если я что-то упустил?grep
может быть? Попробуйте изменитьgrep
наcommand grep
, если вы все еще видите пробелы после примера ввода.Я верю, что
sed
справится с этим гораздо лучше, чемgrep
. Что-то вроде этого:объяснение
sed
по умолчанию будет смотреть на ваш файл построчно и печатать каждую строку после возможного применения преобразований в кавычках. (sed '' your_file
просто напечатает все строки без изменений).sed
две команды для выполнения в каждой строке (они разделяются точкой с запятой)./^[[:blank:]]*#/d
. В английском это означает, что если строка соответствует хешу в начале (которому предшествует любое количество ведущих пробелов), удалите эту строку (она не будет напечатана).s/#.*//
. В английском, то есть, вместо хэш-метки следует столько вещей, сколько вы можете найти (то есть до конца строки) ничем (ничто не является пустым пространством между последними двумя//
).источник
mystring="Hello I am a #hash"
, станетmystring="Hello I am a"
crontab
разрешают только полнострочные комментарии с пробелом или без него, но не допускают конечные комментарии в строке. Логика НАМНОГО проще. Используйте только первую из двух инструкций Sed в этом ответе для зачистки комментариев crontab.)#
(в столбце 1), есть ли польза дляsed
болееgrep -v "^#"
?Вы можете получить требуемый результат, используя команду sed. Команда ниже сделала трюк для меня.
где
#.*$
- Regexp отфильтрует всю строку, которая начинается с#
конца строкиЗдесь нам нужно удалить эти строки, чтобы мы заменили их пустыми, пропустив часть «замена».
g
упоминание повторного поиска шаблона, пока не будет достигнут конец файла.Общий синтаксис sed:
s/regexp/replacement/flags FileName
источник
sed
команду ...print "#tag" # Print a hashtag.
Как уже отмечали другие, sed и другие текстовые инструменты не будут работать хорошо, если какие-либо части скрипта выглядят как комментарии, но на самом деле это не так. Например, вы можете найти # внутри строки, или довольно распространенный
$#
и${#param}
.Я написал средство форматирования оболочки под названием shfmt , в котором есть функция минимизации кода. Это включает в себя удаление комментариев, среди прочего:
Синтаксический анализатор и принтер являются пакетами Go, поэтому, если вам нужно нестандартное решение, довольно легко написать программу Go из 20 строк, которая удалит комментарии именно тем способом, который вам нужен.
источник
Вы можете использовать обратное совпадение следующим образом:
-v, --invert-match Инвертировать смысл соответствия, чтобы выбрать несовпадающие строки. (-v определяется POSIX.)
источник
evenmorestuff
примера OP.grep -o '^[^#]*' file
будет лучшим решением. это уже объяснил Джимми. спасибо за ваш отзывprint "#tag" # Print a hashtag.
Мне нравится ответ Джозефа, но мне нужно было его удалить // комментарии, поэтому я немного изменил его и проверил на redhat
Могу поспорить, что есть лучший способ удаления пустых строк, чем использование строк, но это было быстрое и грязное решение, которое я использовал.
-cheers
источник
print "#tag" # Print a hashtag.
Это сработало для меня
источник
print "#tag" # Print a hashtag.
Он использует в
#
качестве разделителя столбцов и сохраняет только первый столбец (это все, что раньше#
).источник
YOUR_FILE
это скрипт, содержащий эти команды, он будет помещенcat YOUR_FILE | cut -'
в файл в этой строке.Используйте выражение как
: -v: сделает обратное совпадение
: #: будет соответствовать всем строкам, начинающимся с #
: $ ^: будет соответствовать всем пустым строкам
источник
#
любом месте строки совпадет и удалит всю строку.Лучшее решение было бы использовать команду:
sed -i.$(date +%F) '/^#/d;/^$/d' ntp.conf
-I - это редактирование на месте, но префикс, следующий сразу за ним, указывает sed создать резервную копию. В этом случае с расширением даты (ntp.conf.date) Мы запускаем две команды, каждая с адресным пространством, первая удаляет закомментированные строки, а вторая, отделенная от первой точкой с запятой, удаляет пустые строки.
Я нашел это решение на: theurbanpenguin.com
источник
Похоже, что ни один из других ответов не делает этого должного, они либо оставляют пустыми строками, либо оставляют в строках, где комментарий не находится на первом символе. Я закончил тем, что использовал это:
Это устанавливает псевдоним, так что вам не нужно запоминать его (что невозможно начать с). Откройте новый сеанс, и вы получите новую
nocom
команду. Тогда вы можете простоПриветствия.
источник
.*$
в первом регулярном выражении нет особого смысла - привязка бесполезна, и вы не захватываете сопоставленный текст для замены. использовать только^\s*
print "#tag" # Print a hashtag.
После второго ответа Джозефа Р. я добавляю
/^$/d
удалить пустую строку.источник
Я публикую то, что работает для меня, и, кажется, имеет смысл, после прочтения других, с объяснениями. Пара постов подошла близко, но я пока не могу комментировать (потому что я новичок):
-E
= интерпретировать следующий шаблон как регулярное выражение, похожее на использование egrep-v
= вывести инверсию шаблона (будут напечатаны строки, не соответствующие выражению)"(^#.*|^$)"
= это имеет канал, который обозначает оператор ИЛИ. Это выражение говорит, что нужно напечатать любую строку, которая начинается с#
(и что-нибудь еще после него) ИЛИ любую строку с нулевым символом между началом и концом строки.На
-v
экране будет напечатана инверсия того, что будет любой строкой с символами, которая не начинается с#
.источник
print "#tag" # Print a hashtag.