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

Исходное сообщение
"скрипт с awk или sed"

Отправлено Noob , 06-Ноя-07 12:35 
Всем привет!.. Подскажите пожалуйста как используя awk или sed удалить из файла часть строки начиная с символа "!" и заканчивая символами "*/"
Пример исходного текста:
adfhzcxgn dafg
dafdf !dshdfhgdfg dfg*/ dfgdfg
dfgdfgdfgdfg
Должно получится:
adfhzcxgn dafg
dafdf  dfgdfg
dfgdfgdfgdfg

Заранее спасибо за любую помощь!..


Содержание

Сообщения в этом обсуждении
"скрипт с awk или sed"
Отправлено phpcoder , 06-Ноя-07 12:43 
[...]

[c0der@rock ~]$ cat TEST
adfhzcxgn dafg
dafdf !dshdfhgdfg dfg*/ dfgdfg
dfgdfgdfgdfg
[c0der@rock ~]$ sed 's|\(.*\)![^*]*\*/\(.*\)|\1\2|' TEST
adfhzcxgn dafg
dafdf  dfgdfg
dfgdfgdfgdfg

Подойдёт?


"скрипт с awk или sed"
Отправлено Noob , 06-Ноя-07 13:00 
>[оверквотинг удален]
>[c0der@rock ~]$ cat TEST
>adfhzcxgn dafg
>dafdf !dshdfhgdfg dfg*/ dfgdfg
>dfgdfgdfgdfg
>[c0der@rock ~]$ sed 's|\(.*\)![^*]*\*/\(.*\)|\1\2|' TEST
>adfhzcxgn dafg
>dafdf  dfgdfg
>dfgdfgdfgdfg
>
>Подойдёт?

Как оказывается все просто :-)
Спасибо огромное!!!


"скрипт с awk или sed"
Отправлено Noob , 06-Ноя-07 14:15 
>[оверквотинг удален]
>[c0der@rock ~]$ cat TEST
>adfhzcxgn dafg
>dafdf !dshdfhgdfg dfg*/ dfgdfg
>dfgdfgdfgdfg
>[c0der@rock ~]$ sed 's|\(.*\)![^*]*\*/\(.*\)|\1\2|' TEST
>adfhzcxgn dafg
>dafdf  dfgdfg
>dfgdfgdfgdfg
>
>Подойдёт?

Простите за назойливость, но что делать если эти симвовы встречаются в разных строчках

пример:

asdfsdf dfsg
poijo !klblbib dsfh
dfghdxbxcbn*/ dsfgdg
sdfgdfgdfgdg

А в итоге должно быть:

asdfsdf dfsg
poijo  dsfgdg
sdfgdfgdfgdg

или

asdfsdf dfsg
poijo
dsfgdg
sdfgdfgdfgdg


"скрипт с awk или sed"
Отправлено phpcoder , 06-Ноя-07 14:18 
>Простите за назойливость, но что делать если эти симвовы встречаются в разных
>строчках

Нужно думать ;) В sed  можно текущую строчку сохранить в буфере и считать след. строку. Ну а потом уже натравливать регулярное выражение на всю строку... так.. только вот не знаю как их потом разъединять обратно.. Короче, надо думать)


"скрипт с awk или sed"
Отправлено Noob , 06-Ноя-07 14:33 
>>Простите за назойливость, но что делать если эти симвовы встречаются в разных
>>строчках
>
>Нужно думать ;) В sed  можно текущую строчку сохранить в буфере
>и считать след. строку. Ну а потом уже натравливать регулярное выражение
>на всю строку... так.. только вот не знаю как их потом
>разъединять обратно.. Короче, надо думать)

Т.е. можно сохранить несколько строчек в буфере и потом к ним всем сразу применить команды? А не получится ли то же самое что и при поочередном чтении. Т.е. будет ли он их все в буфере в одну строчку соединять, а потом от туда удалять все лишнее?..


"скрипт с awk или sed"
Отправлено phpcoder , 06-Ноя-07 14:41 
[...]
>Т.е. можно сохранить несколько строчек в буфере и потом к ним всем
>сразу применить команды? А не получится ли то же самое что
>и при поочередном чтении. Т.е. будет ли он их все в
>буфере в одну строчку соединять, а потом от туда удалять все
>лишнее?..

Будет. Команда, кажется P. Почитайте про неё. Я как-то делал подобное.


"скрипт с awk или sed"
Отправлено phpcoder , 06-Ноя-07 14:26 
[...]

[c0der@rock ~]$ sed 's|\(.*\)![^*]*$|\1|;s|^[^*]*\*/||' TEST
asdfsdf dfsg
poijo
dsfgdg
sdfgdfgdfgdg

Решение работает, но заточего конкретно под ваши данные и будет работать не всегда правильно.


"скрипт с awk или sed"
Отправлено Noob , 06-Ноя-07 14:41 
>[...]
>
>[c0der@rock ~]$ sed 's|\(.*\)![^*]*$|\1|;s|^[^*]*\*/||' TEST
>asdfsdf dfsg
>poijo
> dsfgdg
>sdfgdfgdfgdg
>
>Решение работает, но заточего конкретно под ваши данные и будет работать не
>всегда правильно.

Да, это понятно, спасибо, но ведь ситуации разные бывают... неизвестно сколько строчек между ! и */

Т.е. например в выражении

asdfsdf dfsg
poijo !klblbib dsfh
sdafghdfgdg
dfghdxbxcbn*/ dsfgdg
sdfgdfgdfgdg

А в итоге должно быть:


asdfsdf dfsg
poijo
dsfgdg
sdfgdfgdfgdg

а в вашем варианте получится:

asdfsdf dfsg
poijo
sdafghdfgdg
dsfgdg
sdfgdfgdfgdg


Вобщем я в тупике, ищу помощь в доках, но пока не помогает... :-(


"скрипт с awk или sed"
Отправлено phpcoder , 06-Ноя-07 14:53 
>Вобщем я в тупике, ищу помощь в доках, но пока не помогает... :-(

Вот твой ответ:

sed ':s;s|\(.*\)![^*]*\*/\(.*\)|\1\2|;/![^*]*$/{N;bs}'

Работает для всех вариантов: и когда в одной строке, и когда на двух, и когда между ними ещё строчки:

[c0der@rock ~]$ sed ':s;s|\(.*\)![^*]*\*/\(.*\)|\1\2|;/![^*]*$/{N;bs}' TEST | diff -u TEST -
--- TEST        2007-11-06 16:45:24 +0600
+++ -   2007-11-06 16:51:48 +0600
@@ -1,16 +1,12 @@
dfhzcxgn dafg
-dafdf !dshdfhgdfg dfg*/ dfgdfg
+dafdf  dfgdfg
dfgdfgdfgdfg

asdfsdf dfsg
-poijo !klblbib dsfh
-sdafghdfgdg
-dfghdxbxcbn*/ dsfgdg
+poijo  dsfgdg
sdfgdfgdfgdg

asdfsdf dfsg
-poijo !klblbib dsfh
-sdafghdfgdg
-dfghdxbxcbn*/ dsfgdg
+poijo  dsfgdg
sdfgdfgdfgdg

[c1der@rock ~]$


"скрипт с awk или sed"
Отправлено Noob , 06-Ноя-07 15:00 
>[оверквотинг удален]
> sdfgdfgdfgdg
>
> asdfsdf dfsg
>-poijo !klblbib dsfh
>-sdafghdfgdg
>-dfghdxbxcbn*/ dsfgdg
>+poijo  dsfgdg
> sdfgdfgdfgdg
>
>[c1der@rock ~]$

Огромнейшее спасибо!!! Работает просто великолепно!!! :-)
Есть еще на свете добрые люди!.. :)))


"скрипт с awk или sed"
Отправлено phpcoder , 06-Ноя-07 15:02 
>>[оверквотинг удален]
>Есть еще на свете добрые люди!.. :)))

Добрые люди, у которых есть при этом свободное время. :)