Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / вопрос по sed + / 8 сообщений из 8, страница 1 из 1
29.04.2005, 03:27:22
    #33041920
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по sed +
удалось для него накропать относительно полезный скрипт,
который сшарповские текст переделывает в (почти) латех.

но не ясным остается польза от применения команд

перехода на метку

(2)t label

и применения области регулярных выражений и буфера хранения.

может кто знает примеры, когда понятно, что они (переход на метку и работа с буферами хранения) делают?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
                         
                         # //-                      удалить
/\/\/-/d                
                         # /*- бла бла бла   */    удалить
/\/\*-/,/\*\//d         
                         # класс оформить как раздел
                         # и занести в индекс
/class[ 	]/{
s/\(.*class[ 	]*[^{ 	]*\)\(.*\)/\
. 4  \ 1 \
.x \ 1 /p                


r file.dsc.tmp
n
}

/struct[ 	]/{
s/\(.*struct[ 	]*[^{ 	]*\)\(.*\)/\
. 4  \ 1 \
.x \ 1 /p                


r file.dsc.tmp
n
}



/enum[ 	]/{

s/\(.*enum[ 	]*[^{ 	]*\)\(.*\)/\
. 4  \ 1 \
.x \ 1 /p


/enum/r file.dsc.tmp

}


                         #### start of comments
                         # вывести одну строчку  c  одиночным коментарием в документ (если пробелы перед ним)
/protected/,/[{,;]/!{
/internal/,/[{,;]/!{
/public/,/[{,;]/!{
/^[	 ]*\/\/[^/*-]/s/[	 ]*\/\///gp
}
}
}
                         # вывести строчку с доп одиночным комментом. форматирование выключить
                         #   //* или /// as MS want

/protected/,/[{,;]/!{
/internal/,/[{,;]/!{
/public/,/[{,;]/!{

/\/\/[*/]/{
i\
.n
p
a\
.f

}
}
}

}

                         #  вывести часть кода без форматирования /**/ /**/
/\/\*\*/,/\*\*\//{
i\
.n

p
a\
.f

}

                         #  раскрыть коментарии и вывести их в выходной документ
                         # если перед открытием нет символов
                         # и они не стоят после  имени функции до открсобки
/\/\*\*/,/\*\*\//!{
/public/,/{/!{

/^[ 	]*\/\*/,/\*\//{
s/\/\*//
s/\*\///
p
}

}
}
                        ###### enf of comment 


                       #
                       # перед  публичным членом  вывести абзац с дефисом
                       # отключить форматирование
                       # после  ; или  { включить форматирование
                       #  ИЛИ
                       # случай все в одной строчке           #### class
/public.*class/!{
/public.*struct/!{
/enum/!{


/public.*[;{]/{
i\
.-  \
.n

s/{[ \t]*[^ \t]$//
p

a\
.f

n
}

/protected.*[;{]/{
i\
.-  \
.n

s/{[ \t]*[^ \t]$//
p

a\
.f

n
}


/internal.*[;{]/{
i\
.-  \
.n

s/{[ \t]*[^ \t]$//
p

a\
.f

n
}
                       # end of one line 

                       # случай строчек больше двух
/public[^;{]*$/,/[;{]/{
/public/i\
.-     \
.n


/[;{]/{
s/{[ \t]*[^ \t]$//
a\
.f

}
                       #
p

}

/protected[^;{]*$/,/[;{]/{
/protected/i\
.-     \
.n


/[;{]/{
s/{[ \t]*[^ \t]$//
a\
.f

}
                       #
p

}

/internal[^;{]*$/,/[;{]/{
/internal/i\
.-     \
.n


/[;{]/{
s/{[ \t]*[^ \t]$//
a\
.f

}
                       #
p

}
}
                                                           #### class

}
}  
:exit
d

...
Рейтинг: 0 / 0
29.04.2005, 10:56:25
    #33042265
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по sed +
скрипт интересный, спасибо.
щас уже так мало применяют sed, он незаслуженно забыт.

А насчет буфера - помнится, классическое его применение - это
перемещение в тексте строк с определенными паттернами или их обмен.
...
Рейтинг: 0 / 0
29.04.2005, 23:11:02
    #33043762
Alex Roudnev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по sed +
Вообще sed - самая непознаваемая часть Юникса. Я когда то писал инструкцию, но так и не смог понять, как буфера в нем работают. Сегодня для СЛОЖНЫХ преобразований проще использовать перл.

А пример прекрасный.
...
Рейтинг: 0 / 0
30.04.2005, 01:30:08
    #33043800
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по sed +
ну раз вам так нравится,
то вот все
http://sql.ru/forum/actualthread.aspx?tid=176748
...
Рейтинг: 0 / 0
30.04.2005, 01:35:57
    #33043801
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по sed +
-null-
ну да там чето кудато перемещается.
только не понятно, как с этого пользу получить.
я через sed проганяю скрипты по генерации базы данных.
удобно длинные референсы там держать.

типа такого чтото

s/`sex'/char(1) not null default '' references db.sex_t(id) on detete restict/g
...
Рейтинг: 0 / 0
30.04.2005, 10:55:51
    #33043870
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по sed +
помнится тока примитивный и классический пример из литературы - обмен строк с заданным паттерном.
Правда, мне он кажется несколько надуманным.




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
cat test.txt

 1 
 2 
 11 
 22 
 333 
 444 
 111 
 222 

скрипт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#!/bin/sed -f

/ 1 /{
h
d
}
/ 2 /{
G
}
переставляет соответствующие строчки :-)


Но вообще согласен - сейчас sed используем в основном как маленькие однострочники в составе shell программ.

Но иногда было интересно делать аналоги на perl/awk/sed и смотреть время выполнения. Частенько sed побеждает :-)
...
Рейтинг: 0 / 0
01.05.2005, 09:26:53
    #33044362
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по sed +
сенкс
...
Рейтинг: 0 / 0
13.04.2006, 06:31:25
    #33663074
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по sed +
)))
спасибо -Null- еще раз.
не надуманный пример
из сишарповского (думаю с++ и джава тоже покатят) текст
вытягиваю пары наследования классов
родитель - потомок.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
#                 delete multiline comment 
/\/\*/,/\*\//d

/:/d
/,/d
/\bclass\b/,/{/{
                          # class
                          # name1
                          # name2
                          # ...
                          # {    ------ or
                          # class
                          # name1
                          # {
                          # if class name1 +> remember  name1
  /\bclass\b/,/\b\w\w*\b/{
    /\bclass\b/d
    /\b\w\w*\b/h
    d
  }
  /{/d
                         # restore name1

  G
                         # 2 lines +> 1 line
  s/\n/:	/
  p
}


а из списка потом делаю элементы латеха и в пояснительную записку.
...
Рейтинг: 0 / 0
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / вопрос по sed + / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]