Вывод: удалить все комментарии, не относящиеся к шебангу.
sed -e '1{/^\s*\#/{/^\#!/!d}}' -e '1!{/^\s*\#/d}' file
Ваша команда изменена для использования одинарных кавычек (без двойных \\
):
sed '/^\(\s\)*\#/d'
будет работать почти правильно, просто добавив деталь, что (после #) должно быть что-то, что не является звездочкой [^!]
sed '/^\(\s\)*\#[^!]/d'. Но это не удастся с пустой строкой после символа комментария (
#`).
Для этого нужно утверждать, что линия закончилась ($
).
Для этого нам потребуется использование расширенного синтаксиса ([^!]|$)
:
sed -E '/^\s*\#([^!]|$)/d'
Или, более переносимого:
sed -E '/^[ \t]*\#([^!]|$)/d'
Однако для сценария только первая строка, которая начните как #!
имеет значение.
Все остальные строки, начинающиеся с необязательного пробела и #, являются комментариями:
sed -e '1{/^#!/!d}' -e '1!{/^[ \t]*#/d}' file
Что означает:
Первая -e
, если первая строка начинается с комментария (пробел и #), но не начинается точно с участием #! он стирается.
Вторая -e
другие строки (
1!
), начинающиеся с необязательного пробела и #, удаляются.
Используемый вами шаблон grep может предоставлять минуты:секунды вместо часов:минут.
Следующий grep будет более точным:
Обратите внимание, что я добавил «:» после минут, чтобы указать, что секунды спустя.
egrep "06:00:|06:30:"
Или более общий grep:
egrep ":00:|:30:"