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


29

Я хотел бы знать, есть ли способ, которым я мог бы catподать как php.iniи удалить все строки, начинающиеся с;

Например, если файл содержал это:

;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

и я выполнил правильную команду cat | {remove comments command}, тогда я бы в итоге:

error_reporting  =  E_ALL & ~E_NOTICE

Примечание - Я предполагал , что catбудет лучшим способом сделать это , но я на самом деле хорошо с ответом с помощью другой утилиты , как awk, sed, egrepи т.д.


Как насчет чего-то вроде error_reporting = E_ALL & E_NOTICE ; Show all errors, except for notices? Следует ли удалять комментарий и в этом случае?
CVN

@ MichaelKjörling - у меня все хорошо, только строки начинаются с удаления комментариев
cwd

1
catэто инструмент для объединения файлов. grepинструмент для фильтрации линий по шаблонам sedи awkможет также изменить эти строки.
Стефан Шазелас

Ответы:



25

Вам не нужно передавать файл через grep, grep принимает имена файлов в качестве аргументов командной строки.

grep -v '^#' file1 file2 file3

напечатает все строки, кроме тех, которые начинаются с символа #. Вы можете изменить комментарий char на что угодно.

Если у вас есть более одного комментария char (предполагается, что в начале строки)

egrep -v '^(;|#|//)' filelist

2
Еще один, который я делал, всегда был со мной grep '^[^;]' filename. Я не могу говорить с его мобильностью, хотя!
Джоди С

@JodieC, это портативно, но также удаляет пустые строки (что часто желательно). Стандартным эквивалентом egrepявляется grep -E. Можно также использоватьgrep -ve '^[;#]' -e '^//'
Стефан Chazelas

9

egrepможет спасти вас от использования cat. Другими словами, создайте меньше процессов ( egrepvs cat+ egrep) и используйте меньше буферов (конвейер от catк egrepпротив конвейера)

Обычно рекомендуется ограничить использование, catесли вы просто хотите передать файл команде, которая может прочитать его самостоятельно.

С учетом сказанного следующая команда удалит комментарии, даже если они имеют отступы или пробелы:

egrep -v '^ [[: blank:]] *;' file.ini

Забавно, что вы комбинируете новый формат регулярных выражений [[ класса символов ]] с использованием egrepкоманды, которая устарела как минимум десять лет или около того.
mikeserv

Интересно ... текущие документы на gnu.org/software/grep/manual/html_node/… включают классы POSIX.
Джек

7
egrep -v '^;|^$' $file

это исключит строки, начинающиеся с ';', и пустые строки.

в регулярном выражении ^указывает начало строки и $конец строки, поэтому ^$указывает строки, где символ начала строки и символ конца строки расположены рядом друг с другом.


так что, если я читаю это право, это может удалить закомментированные строки, но также и пустые строки?
cwd

1
@cwd Да. Я не знаю , почему он включил оба, но если вы хотите , чтобы удалить строки комментариев просто использоватьegrep -v '^;'
Майкл Mrozek

4
egrep тоже любит файлы (меньше процессов и использованных буферов), и небольшим бонусом было бы удалить также комментарии с отступами:egrep -v '^[[:blank:]]*;' file.ini
nrolans

10
Нам нужен значок «бесполезное использование кошки».
Саймон Рихтер

@nrolans - похоже на популярный комментарий, почему бы не сделать его ответом?
cwd

2

Простой awkоднострочник awk '/^;/{next}1' input_fileдолжен сделать свое дело.

[jaypal:~/Temp] cat file
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

[jaypal:~/Temp] awk '/^;/{next}1' file
error_reporting  =  E_ALL & ~E_NOTICE
[jaypal:~/Temp] 

3
Правильно, но многословно. Просто awk '!/^;/' input_fileдостаточно.
Манатворк

2

Как и Jaypal, я также, скорее всего, использовал бы awkдля этих целей. Еще хуже упомянуть, что Perl иногда очень удобен для таких целей:

cat data.txt | perl -lne "print unless /^;/"

Регулярные выражения Perl более мощные, чем в awk, и иногда они могут понадобиться.


+1 для perl, хотя cat и -l оба избыточны, поэтому более простой вызовperl -ne 'print unless /^;/' data.txt
Саймон Уитакер

@ Симон Уитакер, да, вы правы - это просто привычка писать так, как я пишу, и это стоит упомянуть.
Shabunc

1
Конечно. На самом деле, я думаю, что catработает хорошо в этих примерах, если вы рассматриваете его как прокси для более общего «всего, генерирующего текст на STDOUT». Unix трубы - лучшая вещь из нарезанного хлеба, imho. :)
Саймон Уитакер

2

Подробно об ответе @ shabunc, в котором используется Perl для удаления комментариев (включая встроенные комментарии), а затем печати любых строк, содержащих что-либо, кроме пробелов.

$ perl -ne 's/;.*//; print if /\S/' data.txt

Объяснение:

  • s/;.*//использует оператор подстановки ( s/<regex>/<replacement>/) для замены экземпляров точки с запятой и всего, что следует за ней в строке, пустой строкой.
  • print if /\S/печатает строку, если она соответствует регулярному выражению \S, которое является классом символов, соответствующим всем непробельным символам.

1

Вот тот, который я использую, просто замените ';' с символом комментария (например, '#' для многих файлов конфигурации службы UNIX):

grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'

Это избавляет от всех целочисленных комментариев (даже если они имеют начальные пробелы), а также от любых комментариев, которые заканчивают строки без комментариев, и кратко удаляет пустые строки из вывода. Это может быть возможно без конвейера (мой sed- или awk-fu, по общему признанию, не очень хорош), но мне так легко понять (и запомнить), что я решил опубликовать это здесь


1

Пример показывать только строки + не показывать новые строки или строки emtpy:

$ egrep -v '^(;|#|//)' /etc/ssh/sshd_config | tr '\n' ' '

 Protocol 2    SyslogFacility AUTHPRIV      PasswordAuthentication yes  ChallengeResponseAuthentication no   GSSAPIAuthentication yes GSSAPICleanupCredentials yes  UsePAM yes  AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS  X11Forwarding yes   Subsystem sftp    /usr/libexec/openssh/sftp-server 

ИЛИ

$ egrep -v '^(;|#|//|$)' /etc/ssh/sshd_config    

Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem   sftp    /usr/libexec/openssh/sftp-server

2
Использование egrepдавно устарело. grep -Eэто команда, которую вы ищете здесь.
mikeserv

0
egrep -v ^'(#|$)' file.txt

Удаляет все комментарии и пустые строки из файла file.txt.


2
Вы должны рассмотреть вопрос о расширении своего ответа, добавив немного больше информации для непосвященных (например, именно то, что делает регулярное выражение, которое вы используете).
HalosGhost

egrepамортизируется Используйте grep -Evвместо этого.
Йокай


0

Вы можете использовать следующую команду для сохранения строк, исключая пустые строки и строки, начинающиеся с # в новом файле

cat <file to be read> | egrep -v '^#|^$' > <file to be written at>


Бесполезная catтруба и egrepамортизируется и должна быть заменена grep -Eна расширенные выражения или просто grep -v.
Йокай
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.