Если то диалоговое окно открывается, и система все еще отвечает, можно работать dmesg
от терминала для наблюдения сообщений ядра, которые покажут ошибку.
Один из способов удаления всех комментариев - использовать grep
с опцией -o
:
grep -o '^[^#]*' file
, где
-o
: печатает только совпадающую -часть строки^
: начало строки[^#]*
: любой символ, кроме #
, повторяющийся нулем или более разОбратите внимание, что пустые строки тоже будут удалены, но строки, содержащие только пробелы, останутся.
Я считаю, что sed
может справиться с этим намного лучше, чем grep
. Примерно так:
sed '/^[[:blank:]]*#/d;s/#.*//' your_file
Explanation
sed
по умолчанию будет просматривать ваш файл построчно и печатать каждую строку после возможного применения преобразований в кавычках. ( sed '' your_file
просто напечатает все строки без изменений). sed
две команды для выполнения в каждой строке (они разделены точкой с запятой). / ^ [[: blank:]] * # / d
. На английском это означает, что если строка соответствует хешу в ее начале (которому предшествует любое количество начальных пробелов), удалите эту строку (она не будет напечатана). s /#.*//
. То есть на английском языке замените хэш-метку, за которой следует столько вещей, сколько сможете найти (то есть до конца строки) ни на что (ничто не является пустым пространством между двумя последними //
) . Вы можете использовать обратное сопоставление следующим образом:
#grep -v "#" filename
-v, --invert-match Измените смысл совпадения, чтобы выбрать несовпадающие строки. (-v определяется POSIX.)
Вы можете добиться необходимого выхода с использованием команды SED. Ниже приведена команда для меня трюк.
sed 's/#.*$//g' FileName
Где
#. * $
- REGEXP будет фильтровать всю строку, которая начинается с #
до конца строки здесь, мы должны удалить эти линии, чтобы мы заменены пустыми так пропущенными «заменой».
G
- упоминание повторного поиска шаблона до достижения конца файла. Общий синтаксис SED: / Regexp / замена / флаги Имя файла
cat YOUR_FILE | cut -d'#' -f1
Он использует #
в качестве разделителя колонок и сохраняет только первую колонку (это все до #
).
Мне нравится ответ Джозефа, но он также нужен для удаления // комментариев, поэтому я немного изменил его и протестировал на redhat
# no comments alias
alias nocom="sed -E '/^[[:blank:]]*(\/\/|#)/d;s/#.*//' | strings"
# example
cat SomeFile | nocom | less
Держу пари, что есть способ удалить пустые строки лучше, чем использование строк, но это было быстрое и грязное решение, которое я использовал.
-приветствия
Используйте выражение типа
egrep -v "#|$^" <file-name>
: - v: будет выполнять обратное совпадение
: #: будет соответствовать всем строкам, начинающимся с #
: $ ^: будет соответствовать всем пустым строкам
{{1} }Как отмечали другие, sed и другие текстовые -инструменты не будут работать должным образом, если какие-либо части скрипта выглядят как комментарии, но на самом деле таковыми не являются. Например, вы можете найти #внутри строки или довольно распространенные $#
и ${#param}
.
Я написал средство форматирования оболочки под названием shfmt , в котором есть функция минимизации кода. Среди прочего, это включает в себя удаление комментариев :
.$ cat foo.sh
echo $# # inline comment
# lone comment
echo '# this is not a comment'
[mvdan@carbon:12] [0] [/home/mvdan]
$ shfmt -mn foo.sh
echo $#
echo '# this is not a comment'
Синтаксический анализатор и принтер являются пакетами Go, поэтому, если вам нужно индивидуальное решение, должно быть довольно легко написать программу Go из 20 -строк для удаления комментариев именно так, как вы хотите.
После второго ответа Джозефа Р. я добавляю /^$/d
, чтобы удалить пустую строку.
sed '/^[[:blank:]]*#/d;s/#.*//;/^$/d'
Ни один из других ответов, похоже, не оправдывает этого, они либо оставляют пустые строки, либо оставляют строки, в которых комментарий не находится на первом символе. В итоге я использовал это:
cat << EOF >> ~/.bashrc
alias nocom='sed -e "/^\s*#/d" -e "/^\s*$/d"'
EOF
Это устанавливает псевдоним, так что вам не нужно запоминать его (, что невозможно начать с ). Откройте новый сеанс, и вы получите новую команду nocom
. Тогда вы можете просто
nocom /etc/foobar.conf
Удачи.
Я публикую то, что работает для меня и, кажется, имеет наибольший смысл, после прочтения других, с объяснением. Пара постов была близка, но я пока не могу комментировать (т.к. я новичок):
grep -E -v "(^#.*|^$)" filename
-E
= интерпретировать следующий шаблон как регулярное выражение, аналогично использованию egrep -v
= печатать инверсию шаблона (строки, не соответствующие выражению, будут напечатаны)"(^#.*|^$)"
= здесь есть вертикальная черта, обозначающая оператор ИЛИ. Это выражение говорит печатать любую строку, начинающуюся с#
(и все остальное после нее )ИЛИ любую строку с нулевым символом между началом и концом строки. -v
будет печатать на экране инверсию того, что будет любой строкой с символами, которые не начинаются с #
.
cat example.sh
#!/bin/bash
# example script
echo "# test";# echo "# test"
# check the first parameter
if [ "$1" = "#" ]; then
# test couple of different cases
echo "#"; # output # character
echo '\#'; # output # character '#' for test purpose
echo \#\#\#; # comment # comment # comment '# comment'
echo \#
echo \#;
echo \#; # comment
fi
# end of the script
sed -e '1{/^#!/ {p}}; /^[\t\ ]*#/d;/\.*#.*/ {/[\x22\x27].*#.*[\x22\x27]/ !{:regular_loop s/\(.*\)*[^\]#.*/\1/;t regular_loop}; /[\x22\x27].*#.*[\x22\x27]/ {:special_loop s/\([\x22\x27].*#.*[^\x22\x27]\)#.*/\1/;t special_loop}; /\\#/ {:second_special_loop s/\(.*\\#.*[^\]\)#.*/\1/;t second_special_loop}}' example.sh
cat example.sh
#!/bin/bash
echo "# test";
if [ "$1" = "#" ]; then
echo "#";
echo '\#';
echo \#\#\#;
echo \#
echo \#;
echo \#;
fi
Прочитайте, как это работает в источнике:https://blog.sleeplessbeastie.eu/2012/11/07/how-to-remove-comments-from-a-shell-script/