Вопрос или проблема
Я хотел бы знать, есть ли способ использовать 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, и вы можете выбрать тот, который лучше всего подходит для ваших нужд. Все приведенные команды обеспечивают эффективную обработку текстовых файлов и позволяют легко манипулировать содержимым.