2010-07-28 18 views
15

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

THX Lidia

+0

Я проверил тест. paxdiablo против Криса Джонсона. В тестовом файле был squid.conf. squid.conf имеет более 1000 строк комментариев для 15 строк конфигурации. Метод paxdiablo работал отлично. Он даже удалял комментарии за конфигурацией в одной строке. Результаты будут именно тем, что вы ожидаете, если не лучше. Обе большие пальцы! Улучшенный метод Chris Johnson, казалось, удалял каждую строку с #, независимо от того, где # помещалось в строку. В результате удаляются строки, которых не должно было быть. Хорошая попытка Криса. Хороший девиз, который мне нравится жить, - «Если это не сломано, не исправляйте». –

ответ

26

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

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

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

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

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

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

+0

, но если я хочу использовать sed -i (как интегрировать) – lidia

+0

Это все еще работает отлично, см. Обновление. – paxdiablo

+4

Несколько аргументов '-e' не нужны. Как только вы можете добавить ';' для предварительной обработки нескольких действий. т. е. 'sed '/^[#;].*$/ d;/^ $/d'' –

3

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


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

, но если« # »не просить файл? (но строка начинается с «#») – lidia

+0

cat file.txt | grep -Ev '(^ #. * $) | (^ $)' удалить строки, начинающиеся с "#" – demetrios

+0

Это очень интуитивно понятное с точки зрения сохранения исходного файла. –

1

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

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

@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 
+0

Есть ли способ объединить два в один шаблон? Я пробовал много комбинаций, но он не работает. Поэтому я хочу знать, есть ли способ, а если нет, почему? Благодаря! – bruin

0

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

СЕПГ -r «/ (^ \ s * #) | (^ \ s * $)/d 'squid.conf.installed

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

0

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

Sudo СЕПГ -i 's /#.*$//;/^$/ d' файл_ввода

0

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

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' 
Смежные вопросы