sed + удалить "#" и пустые строки одной командой sed - PullRequest
22 голосов
/ 28 июля 2010

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

THX Lidia

Ответы [ 7 ]

31 голосов
/ 28 июля 2010

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

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

13 голосов
/ 22 мая 2014

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

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

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

'/^\s*$/d'

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

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

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

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

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

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

sed -e '/^\s*#.*$/d' -e '/^\s*$/d' inputFile
5 голосов
/ 05 марта 2018

Этот крошечный драгоценный камень удаляет все # комментарии, независимо от того, где они начинаются в строке:

sed -e 's/\s*#.*$//'

Пример:

text="
this is a # test
#this is a test
#this is a #test
this is # another #test
"

$echo "$text" | sed -e 's/\s*#.*$//'

this is a


this is

Далее это удаляет любыерезультирующие пустые строки:

$echo "$text" | sed -e 's/\s*#.*$//' | sed -e '/^\s*$/d'
3 голосов
/ 28 июля 2010

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


cat file.txt | grep -Ev '(#.*$)|(^$)'
1 голос
/ 28 июля 2010

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

awk 'NF{gsub(/^[ \t]*#/,"");print}' file
0 голосов
/ 01 июня 2017

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

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

0 голосов
/ 12 ноября 2016

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

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

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

...