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

Если то диалоговое окно открывается, и система все еще отвечает, можно работать dmesg от терминала для наблюдения сообщений ядра, которые покажут ошибку.

24
07.09.2017, 00:35
13 ответов

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

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

, где

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

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

41
27.01.2020, 19:40

Я считаю, что sed может справиться с этим намного лучше, чем grep . Примерно так:

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

Explanation

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

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

    #grep -v "#" filename

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

1
27.01.2020, 19:40

Вы можете добиться необходимого выхода с использованием команды SED. Ниже приведена команда для меня трюк.

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

Где

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

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

  • G - упоминание повторного поиска шаблона до достижения конца файла.

Общий синтаксис SED: / Regexp / замена / флаги Имя файла

4
27.01.2020, 19:40
cat YOUR_FILE | cut -d'#' -f1

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

1
27.01.2020, 19:40

Мне нравится ответ Джозефа, но он также нужен для удаления // комментариев, поэтому я немного изменил его и протестировал на redhat

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

# example
cat SomeFile | nocom | less

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

-приветствия

1
27.01.2020, 19:40

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

sed -i.old -E  "/^(#.*)$/d" file 
1
27.01.2020, 19:40

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

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

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

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

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

{{1} }
0
27.01.2020, 19:40

Как отмечали другие, 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 -строк для удаления комментариев именно так, как вы хотите.

5
27.01.2020, 19:40

После второго ответа Джозефа Р. я добавляю /^$/d, чтобы удалить пустую строку.

sed '/^[[:blank:]]*#/d;s/#.*//;/^$/d'
1
27.01.2020, 19:40

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

cat << EOF >> ~/.bashrc
alias nocom='sed -e "/^\s*#/d" -e "/^\s*$/d"'
EOF

Это устанавливает псевдоним, так что вам не нужно запоминать его (, что невозможно начать с ). Откройте новый сеанс, и вы получите новую команду nocom. Тогда вы можете просто

nocom /etc/foobar.conf

Удачи.

0
27.01.2020, 19:40

Я публикую то, что работает для меня и, кажется, имеет наибольший смысл, после прочтения других, с объяснением. Пара постов была близка, но я пока не могу комментировать (т.к. я новичок):

grep -E -v "(^#.*|^$)" filename
  • -E= интерпретировать следующий шаблон как регулярное выражение, аналогично использованию egrep
  • -v= печатать инверсию шаблона (строки, не соответствующие выражению, будут напечатаны)
  • "(^#.*|^$)"= здесь есть вертикальная черта, обозначающая оператор ИЛИ. Это выражение говорит печатать любую строку, начинающуюся с#(и все остальное после нее )ИЛИ любую строку с нулевым символом между началом и концом строки.

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

0
27.01.2020, 19:40

Пример ввода

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/

3
27.01.2020, 19:40

Теги

Похожие вопросы