Удалить все комментарии linux

How can I «cat» a file and remove commented lines?

I’d like to know if there is a way that I could cat file like php.ini and remove all lines starting with ; For example, if the file contained this:

; - 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 
error_reporting = E_ALL & ~E_NOTICE 

Note — I assumed that cat would be the best way to do this but I’m actually fine with the answer using another utility like awk , sed , egrep , etc.

What about something like error_reporting = E_ALL & E_NOTICE ; Show all errors, except for notices ? Should the comment be removed in that case as well?

cat is the tool to concatenate files. grep is the tool to filter lines based on patterns. sed and awk can also modify those lines.

12 Answers 12

You don’t need to pipe a file thru grep, grep takes filename(s) as command line args.

grep -v '^#' file1 file2 file3 

will print all lines EXCEPT those that begin with a # char. you can change the comment char to whatever you wish.

If you have more than one comment char (assuming its at the beginning of a line)

Another one I’ve done that always stuck with me was grep ‘^[^;]’ filename . I can’t speak to its portability though!

@JodieC, that’s portable but also removes empty lines (Which is often desired). The standard equivalent of egrep is grep -E . One can also use grep -ve ‘^[;#]’ -e ‘^//’

if you want to remove blank lines, and also line with spaces before the ‘#’ you can do: grep -ve ‘\s*#’ -e ‘^$’ filename

egrep can save you the use of cat . In other words, create less processes ( egrep vs cat + egrep ) and use less buffers (pipe from cat to egrep vs no pipe).

It is generally a good idea to limit the use of cat if you simply want to pass a file to a command that can read it on its own.

With this said, the following command will remove comments, even if they are indented with spaces or tabs:

Funny that you combine the newer [[ character class ]] regex format with the use of the egrep command deprecated for at least a decade or so.

that will exclude lines that begin with the ‘;’, and empty lines.

in regex, ^ indicates the beginning of a line, and $ the end of a line, so ^$ specifies lines where the start of line character and the end of line character are right next to each other.

Читайте также:  Удалить сетевой адаптер linux

@cwd Yes. I’m not sure why he included both, but if you only want to remove commented lines just use egrep -v ‘^;’

egrep likes files too (less processes and buffers used), and a little bonus would be to remove indented comments too: egrep -v ‘^[[:blank:]]*;’ file.ini

Strips all comments and empty lines from file.txt

Updated answer per Yokai’s comment. «Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.» ref: https://www.gnu.org/software/grep/manual/grep.html

You should consider expanding your answer with a little more information for the uninitiated (e.g., exactly what the regex you use does).

A simple awk one-liner awk ‘/^;/1’ input_file should do the trick.

[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 '/^;/1' file error_reporting = E_ALL & ~E_NOTICE [jaypal:~/Temp] 

As well as Jaypal, I also most probably would use awk for these purposes. It worse to mention that perl is sometimes quite handy for such purposes:

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

Perl regexps are more powerful compared to awk’s one and sometimes you might need them.

+1 for perl, although the cat and the -l are both redundant, so a simpler invocation is perl -ne ‘print unless /^;/’ data.txt

@Simone Whitaker, yes, you are right — it is just a habit to write it the way i write, and it worth to mention it.

Sure thing. In fact, I think cat works fine in these examples if you consider it as a proxy for the more generic «anything generating text on STDOUT». Unix pipes are the best thing since sliced bread, imho. 🙂

An elaboration on @shabunc’s answer, this uses Perl to strip comments (including inline comments), then print any lines containing anything other than whitespace.

$ perl -ne 's/;.*//; print if /\S/' data.txt 
  • s/;.*// uses the substitution operator ( s/// ) to replace instances of a semi-colon and everything following it on a line with the empty string.
  • print if /\S/ prints the line if it matches the regexp \S , which is a character class matching all non-whitespace characters.

Here’s one that I use, just substitute ‘;’ with the comment character (e.g. ‘#’ for many UNIX service configuration files):

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

That gets rid of all whole-line comments (even if they have leading whitespace), and any comments that end non-comment lines, and succinctly removes blank lines from the output as well. This may be possible without the pipeline (my sed- or awk-fu is admittedly not great), but it’s so easy for me to understand (and remember), I figured I’d post it here.

Читайте также:  What is vlan tagging in linux

Example show only lines + do not show new lines or emtpy lines:

$ 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 

Источник

Удалить все комментарии linux

Текстовые метки: linux, grep, config, conf, postgresql.conf, regex, regexp, regular, expression, expressions, empty

Запись: and-semakin/mytetra_data/master/base/1549886154yd1kfaz9zx/text.html на raw.githubusercontent.com

grep -v «^\s*\#» postgresql.conf | grep .

  • Как установить Telegram на Linux
  • Расположение .desktop-файлов ярлыков программ
  • Как установить свежие версии фреймворка Qt
  • Использование команды tar
  • Показать список открытых портов на прослушивание
  • Подключение по SSH к устаревшим серверам
  • Рекурсивный поиск строки по файлам в папке через grep в Linux
  • Использование tcpdump
  • Корректные права на директорию .ssh в Linux
  • Скопировать директорию с выводом прогресса в Linux
  • Примонтировать автоматически Samba к Linux
  • Сгенерировать ключи SSH
  • Статистика использования диска в Linux
  • Выполнение команд по расписанию через CRON в LInux
  • scp stalled в Linux
  • Записать загрузочный ISO на USB в Linux
  • Очистить файл от пустых строк в Linux
  • Остановить процесс в Linux
  • iotop — показать загруженность жестких дисков в Linux
  • Проксирование любого трафика через SSH (sshuttle)
  • Найти 10 самых крупных файлов в Linux
  • Заставить пользователя сменить пароль при следующем входе в систему в Linux
  • Поиск grep в потоке данных в Linux
  • Отобразить информацию о системе Linux
  • Туннелирование трафика в SSH
  • Примонтировать общую папку VirtualBox в гостевой машине Linux
  • Загрузить файл из терминала на transfer.sh
  • Установить minikube на Linux
  • Получить адрес текущего сервера DNS в Linux
  • jq — консольный парсер JSON
  • wsc — консольный клиент для WebSocket
  • Использование команды gzip
  • Использование find в Linux (поиск файлов)
  • Диагностика SSL
  • Очистить файл в Linux
  • Выделить несколько файлов/директорий в midnight commander (mc)
  • Сменить редактор в midnight commander (mc)
  • Добавить номера строк к выводу cat
  • Вывести разрешения на файлы в восьмеричном формате в Linux
  • Получить настоящее (rich) содержимое буффера обмена в Linux
  • Установить разрешения на файлы и папки рекурсивно в Linux при помощи find
  • Найти файлы, удовлетворяющие нескольким условиям в find
  • Выполнить несколько действий над файлами в find
  • Установить Haskell Stack на Linux
  • Установить Intero на Linux
  • Удалить все комментарии и пустые строки из файла в Linux
  • Выслать уведомление в Linux
  • Использование команды zip в Linux
  • Найти все файлы, которыми владеет root в Linux
  • Создать раздел, на который будут иметь доступ все пользователи
  • Загрузить систему Linux в режиме восстановления
  • Запустить долгую программу через screen по ssh
  • Склеить аудиофайлы с паузами через ffmpeg
  • Установить asdf — универсальный менеджер версий
  • Сохранить файл с sudo в vim
  • Установить клиент Travis CI на Linux
  • Записать загрузочный ISO с Windows на USB в Linux через WoeUSB
  • Установить MyTetra на Linux
  • Вывести тело ответа без лишнего вывода через команду wget
  • Собрать Python 2.4 или более ранние версии через pyenv или asdf в Linux
  • Загрузить SSH-ключи на удаленный сервер
  • Исключить строки с пподстрокой при помощи grep
Читайте также:  What is default linux root password

Источник

sed -d

Изображение баннера

Удалить строку в которой нет определённого паттерна

Для таких операций можно использовать !d — это противоположная d операция — удалятся строки где паттерна нет, то есть останутся те, где паттерн присутствует.

Например в файле visited.log Есть строки вида

Если стоит задача выписать в отдельный файл только посещения heihei.ru

sed ‘ / heihei / !d ‘ visited.log > hh.log
cat hh.log

Удалить первые несколько строк

Допустим Вы хотите удалить три первые строки файла example.txt

Удалить пустые строки

Если строка действительно пустая, то подойдёт команда

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

Удалить такие строки тоже можно

$ sed ‘ / ^[[:space:]]*$ / d ‘ input.txt > output.txt

Удалить комментарии

Допустим, у вас есть код или просто текст в котором много комментариев.

Строка с комментариями начинается с символа #

Рассмотрим файл websites

Чтобы удалить строки с комментариями выполните

Опция -i позволяет изменять текущий файл

Если хотите сохранить исходный файл а текст без комментариев записать в новы (если вы уже удалили комментарии — убедитесь, что вы их вернули обратно)

sed ‘/^#/ d ‘ websites > nocomments
cat nocomments

Опция -i не нужна так как исходный файл мы не изменяли

Чтобы удалить строки с комментариями и пустые строки выполните

Удалить комментарии и пустые строки

sed -i.bak ‘/^\s*#/ d ;/^$/ d ‘ nginx.conf
vi nginx.conf

Удалить строку со словом

Удалить все строки где встречается слово Apple в файле input.txt

Here is an Apple Here Pen Here ApplePen Integer is Here Here is a Float Here Pen Here Pineapple Here PineapplePen Umm Apple Apple Apple Pen

Сделать это можно с помощью опции d

sed ‘/Apple/d‘ input.txt > output.txt

Integer is Here Here is a Float Here Pen Here Pineapple Here PineapplePen

ApplePen

Усложним условие — удалим все строки где есть слово Pineapple и слово Integer

sed ‘/Pineapple\|Integer/ d ‘ input.txt > output.txt

| выступает в роли логического ИЛИ

\ нужна чтобы экранировать |

Here is an Apple. Here is a Pen. Here is an ApplePen Here is a Float Umm Apple Apple Apple Pen

Удаление без d

Удалять из файлов можно и без применения d

Источник

Оцените статью
Adblock
detector