LinuxForum.Fans
Тема

Скопировать пару строк из файла в другой

Автор: SergMarkov 41 сообщений 3806 просмотров
#288783

с update да. неверно.
но его можно заменить на
"post_install()"

sed -e '/./{H;$!d;}' -e 'x;/post_install()/!d;' .INSTALL | egrep -v "{|}"

#288784
Lupo Alberto написал:
moshell, покажите «свой» файл .INSTALL, который вы используете для проверки.
text
gu@moshell:~$ cat .INSTALL 
post_install() {
  update-mime-database /usr/share/mime > /dev/null
  update-desktop-database -q
  #[ -d /usr/lib/gio/modules ] && gio-querymodules /usr/lib/gio/modules
}

post_upgrade() { post_install }

post_remove() { post_install }

gu@moshell:~$ sed -e '/./{H;$!d;}' -e 'x;/post_install()/!d;' .INSTALL | egrep -v "{|}"

update-mime-database /usr/share/mime > /dev/null update-desktop-database -q #[ -d /usr/lib/gio/modules ] && gio-querymodules /usr/lib/gio/modules gu@moshell:~$

#288786
"moshell" написал:
но его можно заменить на
"post_install()"

Всё равно не правильно. Гляньте вывод без последнего egrep — в нём есть строка post_install, которая egrep не «режется».

#288787
Lupo Alberto написал:
Всё равно не правильно. Гляньте вывод без последнего egrep — в нём есть стока post_install, которая egrep не «режется».
text
gu@moshell:~$ cat .INSTALL 
post_install() {
  update-mime-database /usr/share/mime > /dev/null
  update-desktop-database -q
  #[ -d /usr/lib/gio/modules ] && gio-querymodules /usr/lib/gio/modules
}

post_upgrade() { post_install }

post_remove() { post_install }

gu@moshell:~$ sed -e '/./{H;$!d;}' -e 'x;/post_install()/!d;' .INSTALL

post_install() { update-mime-database /usr/share/mime > /dev/null update-desktop-database -q #[ -d /usr/lib/gio/modules ] && gio-querymodules /usr/lib/gio/modules } gu@moshell:~$ sed -e '/./{H;$!d;}' -e 'x;/post_install()/!d;' .INSTALL | egrep -v "{|}"

update-mime-database /usr/share/mime > /dev/null update-desktop-database -q #[ -d /usr/lib/gio/modules ] && gio-querymodules /usr/lib/gio/modules gu@moshell:~$

все режется

#288788

А что за оболочка? Я в zsh и bash проверял.

#288789

а что если щаз придет ТС и скажет, что в теле
post_install() {
.
.
}
могу быть еще вложенные {}

SergMarkov написал:
надо вытащить все между post_install() { и замыкающей }
и все строчки между ними, причем строчки могут быть любыми

тогда ни мой и ваш случаи не работают =Р

#288790
Lupo Alberto написал:
А что за оболочка? Я в zsh и bash проверял.

gu@moshell:~$ echo $SHELL
/bin/bash
gu@moshell:~$

да при чем тут оболочка?
egrep -v полностью отсекает строки содержащие "{" и "}"

#288791

Serj, хватит тут вуайеристического критика изображать ))
покажи лучше как змея в этом плане работает?

#288792
"moshell" написал:
могу быть еще вложенные {}

Сильно удивлюсь, если в теле функции будут вложенные фигурные скобки.
Если такое всё же случиться, то...

text

sed -n -e '/post_install() {[[:space:]]*$/,/^[[:space:]]*}[[:space:]]*$/p' INSTALL | sed -e '1d;$d' > doinst.sh
#288793
"moshell" написал:
egrep -v полностью отсекает строки содержащие "{" и "}"

В файле .INSTALL есть лишние строки, несодержащие фигурных скобок.

Ладно, всё это пустое сотрясание воздуха. Пусть ТС сам решает, как удобнее ;)

#288794
"moshell" написал:
Serj, хватит тут вуайеристического критика изображать ))
покажи лучше как змея в этом плане работает?

Да-да, просим *BRAVO*

#288795
Lupo Alberto написал:
[quote="moshell"]egrep -v полностью отсекает строки содержащие "{" и "}"

В файле .INSTALL есть лишние строки, несодержащие фигурных скобок.

Ладно, всё это пустое сотрясание воздуха. Пусть ТС сам решает, как удобнее ;)[/quote]
Альберто, смысл моего метода заключается в том, что он отделяет нужный нам абзац. а абзацы разделены пустой строкой.
то есть все остальные строки post_install без фигурных скобок отсекаются еще на стадии прохождения sed. ок?)

#288808
Lupo Alberto написал:
Я, мягко говоря, с sed не в ладах, можно сделать «красивее»...
[console]
lupo@gentoo-laptop /tmp % cat INSTALL
post_install() {
update-mime-database /usr/share/mime > /dev/null
update-desktop-database -q
#[ -d /usr/lib/gio/modules ] && gio-querymodules /usr/lib/gio/modules
}
post_upgrade() {
post_install
}

post_remove() {
post_install
}
lupo@gentoo-laptop /tmp % sed -n -e '/post_install() {/,/^}/p' INSTALL | sed -e '1d;$d' > doinst.sh
lupo@gentoo-laptop /tmp % cat doinst.sh
update-mime-database /usr/share/mime > /dev/null
update-desktop-database -q
#[ -d /usr/lib/gio/modules ] && gio-querymodules /usr/lib/gio/modules
[/console]

Вот ! То что надо. Спасибо :-)

#288910
"moshell" написал:
Serj, хватит тут вуайеристического критика изображать ))
покажи лучше как змея в этом плане работает?

Вы хотите извращений? Их есть у меня :D

text

#!/usr/bin/env python
#_*_ coding: utf-8 _*_

lines = open('INSTALL', 'r').readlines() data = []

counter = 0 IN = False for line in lines: if 'post_install()' in line: IN = True if IN and '{' in line: counter += 1 if IN and '}' in line: counter -= 1 if counter and ('post_install()' not in line) and (len(line) > 2): data.append(line.lstrip()) if IN and not counter: IN = False

f = open('doinst.sh', 'w').writelines(data)

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

#288913

-=Serj=-,
Мощно задвинул! Внушает. ©

#288917
Lupo Alberto написал:
-=Serj=-,
Мощно задвинул! Внушает. ©

Я старался:)

#288921

ничего себе.

интересно, на перле одной строкой это будет делаца?

#288922
Lupo Alberto написал:

Сильно удивлюсь, если в теле функции будут вложенные фигурные скобки.
Если такое всё же случиться, то...
text

sed -n -e '/post_install() {[[:space:]]*$/,/^[[:space:]]*}[[:space:]]*$/p' INSTALL | sed -e '1d;$d' > doinst.sh

Я поставил вот этот вариант, но тут маленький вопросик - как убрать пробелы перед
gtk-update-icon-cache -q -t -f usr/share/icons/hicolor
то есть выклинивает и записывает прекрасно, но наверное лучше без лидирующих пробелов, вот так
gtk-update-icon-cache -q -t -f usr/share/icons/hicolor

#288924
text
sed -n -e '/post_install() {/,/^}/p' INSTALL | sed -e '1d;$d' -e 's/[[:space:]]*//'
#288965

| sed -e 's/^ *//'

Войдите или зарегистрируйтесь, чтобы ответить.