LINUX.ORG.RU

Очистка bash скрипта от комментариев


0

1
#!/bin/sh
#
# ~/.xinitrc
#
# Executed by startx (run your window manager from here)

if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for f in /etc/X11/xinit/xinitrc.d/*; do
    [ -x "$f" ] && . "$f"
  done
  unset f
fi

# exec gnome-session
# exec startkde
# exec startxfce4
# ...or the Window Manager of your choice

Пытался сделать так:

sed '/^#[^\!]/d' ~/.xinitrc

Выводит:

#!/bin/sh
#
#

if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for f in /etc/X11/xinit/xinitrc.d/*; do
    [ -x "$f" ] && . "$f"
  done
  unset f
fi

Для регулярки нужно два символа, поэтому строки из одних решёток остаются.

Пришел к этому варианту:

sed '2,$ s/^#.*$//'

Но с удалением строк не работает:

sed '2,$ /^#/d'

Пришлось делать две команды:

sed '2,$ s/^#.*$//;^$/d'

Поделитесь другими способами.

Ответ на: комментарий от Slavaz

sed '/^#[^!]*/d'

экранирование в пределах [] не нужно

anonymous ()

Шабанг можно явно распечатать, например.

sed -e '1p' -e '/^#/d'
Belkrr ()

# сжирает #/bin/sh

sed '/^#[^!]*/d' /etc/skel/.xinitrc

# оставляет две решётки

sed '/^#[^!].*/d' /etc/skel/.xinitrc

# работает

sed '/^#\([^!]\|$\)/d' /etc/skel/.xinitrc

# работает, сносит пустые строки

sed '/\(^#[^!]\|#$\|[\ \t][\ \t]*#\)/d' /etc/skel/.xinitrc

# работает, позновательное комбо

sed -e '1p;/^#/d' /etc/skel/.xinitrc

# работает, этим можно грабить корованы, до конца не вник

sed '/^[ \t]\+#/d ; /^#\([^!]\|$\)/d ; s~\([^#]\)[ \t]*#.*~\1~' /etc/skel/.xinitrc

Спасибо всем.

ksevelyar ()

grep '^[^#]'

Из недр данного форума. Хорошо для чтения конфигов, убирает строки пустые и начинающиеся на #. Срежет шабанг и оставит пустые строки из пробелов и комментарии начинающиеся не от начала строки.

sin_a ★★★★★ ()
Ответ на: комментарий от drBatty

для Ъ без объяснений.

#!/bin/sed -rf

# сохранение строки
h

:begin_loop
	# p
	# удаление обычного начала
	s/^[^'"#\]+(.*)/\1/
	t begin_loop
	# удаление экранированных символов
	s/^\\.//
	t begin_loop
	# удаление закавыченного блока
	s/^'[^']*'//
	t begin_loop
	s/^'.*//
	T lq
		# незакрытый блок кавычек, необходима подгрузка
		${
			x
			b end
		}
		n
		H
		s/^/'/
		t begin_loop
	:lq
	# удаление экранированной кавычки внутри закавыченного блока
	s/^"[^"]*\\"/"/
	t begin_loop
	# удаление закавыченного блока
	s/^"[^"]*"//
	t begin_loop
	s/^".*//
	T lq2
		${
			x
			b end
		}
	n
	H
	s/^/"/
	t begin_loop
	:lq2
	/^\#/{
		# теперь строка начинается с #
		H
		x
		s/^(.*)(\#[^\n]*)\n\2$/\1/
		b end
	}
	# а коммента и нету
	x

	:end
# s/.*/\x1b[32m'&'\x1b[0m/

drBatty ★★ ()
Ответ на: комментарий от ksevelyar

ясно. ну что делать, если в bash'е можно делать многострочные блоки в кавычках?

Мой скрипт ещё и слишком прост, т.к. не учитывает встроенных документов.

drBatty ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.