Sed + удалить "#" и пустые строки с помощью команды sed

как удалить строки комментариев (как # bal bla) и пустые строки (строки без charecters) из файла с помощью одной команды sed?

спасибо Lidia

Ответ 1

Если вы беспокоитесь о запуске двух процессов sed в конвейере, а не в одном, вам, вероятно, не должно быть, это не так неэффективно.

Однако, если вам нужен один процесс, вы можете использовать несколько аргументов -e, например:

sed -e 's/#.*$//' -e '/^$/d' inputFile

В ответ на ваш комментарий о том, почему вам нужен один процесс, вы хотите использовать sed -i для редактирования на месте, вы все равно можете сделать это в соответствии со следующей стенограммой:

pax> echo 'Line # with a comment' >qq
pax> echo >>qq
pax> echo '# Line with only a comment' >>qq
pax> cat qq
Line # with a comment

# Line with only a comment
pax> sed -i -e 's/#.*$//' -e '/^$/d' qq
pax> cat qq
Line
pax> _

Обратите внимание, как файл изменяется на месте даже с двумя параметрами -e. Вы можете видеть, что обе команды выполняются в каждой строке. Сначала строка с комментарием удаляется, а все удаляется, поскольку она пуста.

Кроме того, также удаляется исходная пустая строка.

Ответ 2

@paxdiablo имеет хороший ответ, но его можно улучшить.

(1) Предложение '/^$/d' соответствует только 100% пустым строкам.

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

'/^\s*$/d'

(2) Предложение 's/#.*$//' соответствует только строкам, начинающимся с символа # в столбце 0.

Если вы хотите также сопоставлять строки, у которых есть только пробелы перед первым #, используйте это вместо:

'/\s*#.*$/d'

Вышеуказанные критерии могут быть не универсальными (например, в блоке HEREDOC или в многострочной строке Python различные подходы могут быть значительными), но во многих случаях обычное определение "пустых" строк включает в себя только пробелы, и "комментарии" включают пробелы-then- #.

(3) И, наконец, по OSX, по крайней мере, решение @paxdiablo, в котором первое предложение превращает строки комментариев в пустые строки, а вторая строка пустых строк (включая исходные комментарии) не работает. Кажется более переносимым, чтобы обе статьи /d удаляли действия, как я сделал.

Пересмотренная команда, включающая следующее:

sed -e '/\s*#.*$/d' -e '/^\s*$/d' inputFile

Ответ 3

Альтернативный вариант, используя grep:


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

Ответ 4

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

awk 'NF{gsub(/^[ \t]*#/,"");print}' file

Ответ 5

В (одном из) моих linux-боксов sed понимает расширенные регулярные выражения с параметром -r, поэтому:

sed -r '/(^\s * #) | (^\s * $)/d' squid.conf.installed

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

Ответ 6

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

sudo sed -i 's/#.*$//;/^$/d' inputFile