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

Вопрос или проблема

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

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

;   - Показать все ошибки, кроме уведомлений
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Показать только ошибки
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Показать все ошибки, кроме уведомлений
;
error_reporting  =  E_ALL & ~E_NOTICE

Если я выполню правильную команду cat | {команда для удаления комментариев}, то в итоге я получу:

error_reporting  =  E_ALL & ~E_NOTICE

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

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

grep -v '^#' file1 file2 file3

Этот вариант выведет все строки, ЗА ИСКЛЮЧЕНИЕМ тех, которые начинаются с символа #. Вы можете изменить символ комментария на любой другой, который хотите.

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

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

Вы можете использовать:

sed -e '/^;/d' php.ini

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

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

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

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

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

Эта команда исключит строки, которые начинаются с ‘;’, и пустые строки.

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

grep -Ev ^'(#|$)' file.txt

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

Обновленный ответ согласно комментарию Yokai. “Прямой вызов как egrep, так и fgrep устарел, но предоставляется для обеспечения нормальной работы исторических приложений, которые на них полагаются.” Ссылка: https://www.gnu.org/software/grep/manual/grep.html

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

[jaypal:~/Temp] cat file
;   - Показать все ошибки, кроме уведомлений
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Показать только ошибки
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Показать все ошибки, кроме уведомлений
;
error_reporting  =  E_ALL & ~E_NOTICE

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

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

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

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

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

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

Объяснение:

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

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

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

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

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

$ 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

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

cat <файл для чтения> | egrep -v '^#|^$' > <файл для записи>

Эта команда также удалит пустые строки

grep -E -v "^\s*($|;)" php.ini

cat /etc/ssh/sshd_config | grep "^\b"

Эта команда работает довольно хорошо.

Ответ или решение

Чтобы вывести содержимое файла, например, php.ini, и удалить все строки, начинающиеся с символа ;, вы можете использовать несколько команд в UNIX/Linux. Вот несколько способов, как это сделать:

1. Использование grep

Команда grep может быть использована для фильтрации строк, что позволяет вам легко исключить комментарии:

grep -v '^[[:space:]]*;' php.ini

Объяснение:

  • -v — означает не выводить строки, которые соответствуют шаблону.
  • ^[[:space:]]*; — обозначает строки, которые начинаются с пробелов или табуляций, за которыми следует ;.

2. Использование sed

С помощью утилиты sed также можно удалить строки, начинающиеся с ;:

sed '/^;/d' php.ini

Объяснение:

  • ^; — регулярное выражение, которое соответствует строкам, начинающимся с ;.
  • d — команда для удаления этих строк.

3. Использование awk

Утилита awk предлагает более мощные средства обработки текста:

awk '!/^\s*;/' php.ini

Объяснение:

  • ! — означает исключение строк, соответствующих шаблону.
  • /^\s*;/ — соответствует строкам, начинающимся с пробелов, за которыми следует ;.

4. Использование perl

Если вам нужна высокая степень гибкости, вы можете использовать perl:

perl -ne 'print unless /^\s*;/' php.ini

Объяснение:

  • -n — заставляет perl повторно обрабатывать каждую строку.
  • print unless /^\s*;/ — печатает каждую строку, если она не соответствует шаблону комментария.

5. Удаление пустых строк и комментариев одновременно

Если вы хотите одновременно удалить пустые строки и строки, начинающиеся с ;, вы можете использовать:

grep -Ev '^\s*(;|$)' php.ini

Объяснение:

  • -E — позволяет использовать расширенные регулярные выражения.
  • ^\s*(;|$) — соответствует строкам, которые начинаются с пробелов, после чего следует комментарий или строка пустая.

Пример использования

Создайте файл php.ini с содержимым:

;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
error_reporting  =  E_ALL & ~E_NOTICE

Теперь, при выполнении любой из предложенных команд, вы получите:

error_reporting  =  E_ALL & ~E_NOTICE

Заключение

Как видно, есть несколько способов удаления комментариев из файла в UNIX/Linux, и вы можете выбрать тот, который лучше всего подходит для ваших нужд. Все приведенные команды обеспечивают эффективную обработку текстовых файлов и позволяют легко манипулировать содержимым.

Оцените материал
Добавить комментарий

Капча загружается...