URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 48238
[ Назад ]

Исходное сообщение
"вопрос про grep...."

Отправлено kkv79 , 14-Сен-04 07:42 

как спомощью grep отфильтровать строки содержащие # в самом начале строки и пустые строки одновременно?

т.е. чтоб осталось только
bla-bla #comment
bla-bla


Содержание

Сообщения в этом обсуждении
"вопрос про grep...."
Отправлено vitaly80 , 14-Сен-04 08:59 
>как спомощью grep отфильтровать строки содержащие # в самом начале строки и
>пустые строки одновременно?
>т.е. чтоб осталось только
>bla-bla #comment
>bla-bla

самое простое, что пришло на ум
cat primer.txt|grep -v "^#"|grep -xv ""
первый грэп удаляет (-v) строки, начинающиеся с #,
второй - удаляет пустые строки
Комментарии...


"вопрос про grep...."
Отправлено newser , 14-Сен-04 09:18 
>>как спомощью grep отфильтровать строки содержащие # в самом начале строки и
>>пустые строки одновременно?
>>т.е. чтоб осталось только
>>bla-bla #comment
>>bla-bla
>
>самое простое, что пришло на ум
>cat primer.txt|grep -v "^#"|grep -xv ""
>первый грэп удаляет (-v) строки, начинающиеся с #,
>второй - удаляет пустые строки
>Комментарии...

Все верно, но пустые строки удаляются так:
grep -v '^$'


"вопрос про grep...."
Отправлено vitaly80 , 14-Сен-04 10:01 
>Все верно, но пустые строки удаляются так:
>grep -v '^$'
то есть окончательный вариант будет
cat primer.txt|grep -v "^#\|^$"
или
cat primer.txt|grep -v "^\(#\|$\)"



"вопрос про grep...."
Отправлено Дмитрий Ю. Карпов , 14-Сен-04 10:53 
Это - хороший пример для изучения регулярных выражений.

Вероятно, надо убирать ещё и строчки, где между началом и диезом находятся пробелы. Итак:

grep -Ev '^([[:space:]]*#.*)*$' ...

где:
-E - использовать расширенную версию регулярных выражений;
[[:space:]] - любой пробельный символ;
[[:space:]]* - пробельные символы в любом количестве от нуля и выше;
#.* - знак комментария и любые символы после него;
(...)* - то, что внутри скобок, может присутствовать в количестве ноль или более раз (звёздочку можно заменить на вопр.знак или на {0,}).


Впрочем, есть а др.вариант:

grep -E '^[[:space:]]*[^[:space:]#]' ...
где:
^[[:space:]]* - любое количество пробелов в начале строкИ;
[^[:space:]#] - и после них хоть что-то, кроме пробела и комментария.


PS: Все мои рекомендации надо тщательно проверить, т.к. сейчас у меня под рукой нет Shell.