Всем привет!.. Подскажите пожалуйста как используя awk или sed удалить из файла часть строки начиная с символа "!" и заканчивая символами "*/"
Пример исходного текста:
adfhzcxgn dafg
dafdf !dshdfhgdfg dfg*/ dfgdfg
dfgdfgdfgdfg
Должно получится:
adfhzcxgn dafg
dafdf dfgdfg
dfgdfgdfgdfgЗаранее спасибо за любую помощь!..
[...][c0der@rock ~]$ cat TEST
adfhzcxgn dafg
dafdf !dshdfhgdfg dfg*/ dfgdfg
dfgdfgdfgdfg
[c0der@rock ~]$ sed 's|\(.*\)![^*]*\*/\(.*\)|\1\2|' TEST
adfhzcxgn dafg
dafdf dfgdfg
dfgdfgdfgdfgПодойдёт?
>[оверквотинг удален]
>[c0der@rock ~]$ cat TEST
>adfhzcxgn dafg
>dafdf !dshdfhgdfg dfg*/ dfgdfg
>dfgdfgdfgdfg
>[c0der@rock ~]$ sed 's|\(.*\)![^*]*\*/\(.*\)|\1\2|' TEST
>adfhzcxgn dafg
>dafdf dfgdfg
>dfgdfgdfgdfg
>
>Подойдёт?Как оказывается все просто :-)
Спасибо огромное!!!
>[оверквотинг удален]
>[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
>Простите за назойливость, но что делать если эти симвовы встречаются в разных
>строчкахНужно думать ;) В sed можно текущую строчку сохранить в буфере и считать след. строку. Ну а потом уже натравливать регулярное выражение на всю строку... так.. только вот не знаю как их потом разъединять обратно.. Короче, надо думать)
>>Простите за назойливость, но что делать если эти симвовы встречаются в разных
>>строчках
>
>Нужно думать ;) В sed можно текущую строчку сохранить в буфере
>и считать след. строку. Ну а потом уже натравливать регулярное выражение
>на всю строку... так.. только вот не знаю как их потом
>разъединять обратно.. Короче, надо думать)Т.е. можно сохранить несколько строчек в буфере и потом к ним всем сразу применить команды? А не получится ли то же самое что и при поочередном чтении. Т.е. будет ли он их все в буфере в одну строчку соединять, а потом от туда удалять все лишнее?..
[...]
>Т.е. можно сохранить несколько строчек в буфере и потом к ним всем
>сразу применить команды? А не получится ли то же самое что
>и при поочередном чтении. Т.е. будет ли он их все в
>буфере в одну строчку соединять, а потом от туда удалять все
>лишнее?..Будет. Команда, кажется P. Почитайте про неё. Я как-то делал подобное.
[...][c0der@rock ~]$ sed 's|\(.*\)![^*]*$|\1|;s|^[^*]*\*/||' TEST
asdfsdf dfsg
poijo
dsfgdg
sdfgdfgdfgdgРешение работает, но заточего конкретно под ваши данные и будет работать не всегда правильно.
>[...]
>
>[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
Вобщем я в тупике, ищу помощь в доках, но пока не помогает... :-(
>Вобщем я в тупике, ищу помощь в доках, но пока не помогает... :-(Вот твой ответ:
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 ~]$
>[оверквотинг удален]
> sdfgdfgdfgdg
>
> asdfsdf dfsg
>-poijo !klblbib dsfh
>-sdafghdfgdg
>-dfghdxbxcbn*/ dsfgdg
>+poijo dsfgdg
> sdfgdfgdfgdg
>
>[c1der@rock ~]$Огромнейшее спасибо!!! Работает просто великолепно!!! :-)
Есть еще на свете добрые люди!.. :)))
>>[оверквотинг удален]
>Есть еще на свете добрые люди!.. :)))Добрые люди, у которых есть при этом свободное время. :)