sed и вывод пути до файла
Модераторы: /dev/random, Модераторы разделов
-
Grih65kop
- Сообщения: 145
sed и вывод пути до файла
sed 's/.*abc\=//;s/cba.*//;' ./*
Выбираю при помощи sed и регулярного выражения нужный мне текст из файлов в каталоге, все работает.
Не могу добиться вывода имени файла т.е. например,
./file.txt то что выводит sed
./file2.txt то что выводит sed
т.к. необходимо знать в каком именно файле sed нашел строку.
Выбираю при помощи sed и регулярного выражения нужный мне текст из файлов в каталоге, все работает.
Не могу добиться вывода имени файла т.е. например,
./file.txt то что выводит sed
./file2.txt то что выводит sed
т.к. необходимо знать в каком именно файле sed нашел строку.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed и вывод пути до файла
NoWay
sed такого не умеет, если не использовать конструкции вида s///e. (это уже не sed)
-
Nazyvaemykh
- Сообщения: 438
- Статус: Подопытный участник
Re: sed и вывод пути до файла
В ближайшей новой версии GNU sed, кажется, это будет. Может быть, есть уже в разрабатываемой ветке, поглядите, может найдёте патчик.
¡ Страсть к разрушению есть творческая страсть!
-
Grih65kop
- Сообщения: 145
Re: sed и вывод пути до файла
Очень жаль. Мою задачу полностью решает egrep, но я не знаю как вывести при помощи него то что находится между "abc=" и "cba".
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed и вывод пути до файла
задачу в студию. а так не интересно.
а оно надо?
-
Nazyvaemykh
- Сообщения: 438
- Статус: Подопытный участник
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed и вывод пути до файла
Nazyvaemykh
лучше-бы сделали вывод команды = и прочих таких (r, R, etc) не в stdout, а в буфер...
лучше-бы сделали вывод команды = и прочих таких (r, R, etc) не в stdout, а в буфер...
-
Grih65kop
- Сообщения: 145
Re: sed и вывод пути до файла
Есть директория с файлами (их много) следующего содержания:
Код: Выделить всё
1file.txt
123: qqwwqwrfd: qd.dwd: abc=QQWWEERRTT cba=19
2file.txt
342: qqwwqwrfd: qd.dwd: abc=TTRREEWWQQ cba=51
3file.txt
456: qqwwqwrfd: qd.dwd: abc=AASSDDFFGG cba=21Из этих файлов необходимо выбрать текст между "abc=" и "cba", делаю это при помощи sed'a
Код: Выделить всё
sed 's/.*abc\=//;s/cba.*//;' ./*Вывод:
QQWWEERRTT
TTRREEWWQQ
AASSDDFFGG
Но в таком случаи в последствие мне не узнать из какого файла была взята строка.
При помощи grep'a можно добиться этого:
Код: Выделить всё
grep -o 'abc\=.*\ cba' ./*Вывод:
./1file.txt:abc=QQWWEERRTT cba
./2file.txt:abc=TTRREEWWQQ cba
./3file.txt:abc=AASSDDFFGG cba
если бы в этом выводе было бы только то что находится между "abc=" и "cba", то он бы полностью меня устраивал.
-
Alexxx
- Сообщения: 892
- Статус: --==XXX==--
- ОС: Archlinux current
Re: sed и вывод пути до файла
так чтоли нельзя?
Код: Выделить всё
grep -o 'abc\=.*\ cba' ./* | sed 's/abc\=//;s/cba.*//'-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed и вывод пути до файла
Код: Выделить всё
find . -type f -printf "\n-%p\n" -exec cat -n {} \; | iconv -f cp1251 |sed -rn '/^-/{s///;h;b};\~<b>.*</b>~!b;s~</b>~\n&~g;G;s~^\s*([0-9]+).*<b>([^\n]*)\n</b>.*\n([^\n]+)$~\3:\1:\2~p'выбирает всё, что написано между <b> и </b>
Вывод вида имя_файла:номер_строки:искомая_подстрока
Например для этой темы:
Код: Выделить всё
./index.php?showtopic=128553&pid=1182532&st=0&:175:Rus-Linux.net
./index.php?showtopic=128553&pid=1182532&st=0&:208:Здравствуйте, гость
./index.php?showtopic=128553&pid=1182532&st=0&:210:<a href="http://unixforum.org/index.php?amp;act=Search&f=90" id="ipb-tl-search">Поиск</a>
./index.php?showtopic=128553&pid=1182532&st=0&:245:от студентов с запросами готовых решений по заданиям
./index.php?showtopic=128553&pid=1182532&st=0&:261:sed и вывод пути до файла
./index.php?showtopic=128553&pid=1182532&st=0&:374:Автор темы
./index.php?showtopic=128553&pid=1182532&st=0&:615:<!--coloro:#000000--><span style="color:#000000"><!--/coloro-->¡<!--colorc--></span><!--/colorc--> <!--coloro:#FF0000--><span style="color:#FF0000"><!--/coloro-->Страсть<!--colorc--></span><!--/colorc--><!--coloro:#FF8C00--><span style="color:#FF8C00"><!--/coloro--> к <!--colorc--></span><!--/colorc--><!--coloro:#FFFF00--><span style="color:#FFFF00"><!--/coloro-->разрушению<!--colorc--></span><!--/colorc--> <!--coloro:#9ACD32--><span style="color:#9ACD32"><!--/coloro-->есть<!--colorc--></span><!--/colorc--> <!--coloro:#4169E1--><span style="color:#4169E1"><!--/coloro-->творческая<!--colorc--></span><!--/colorc--> <!--coloro:#DDA0DD--><span style="color:#DDA0DD"><!--/coloro-->страсть<!--colorc--></span><!--/colorc-->!
./index.php?showtopic=128553&pid=1182532&st=0&:712:Автор темы
./index.php?showtopic=128553&pid=1182532&st=0&:946:<a href="http://unixforum.org/index.php?showuser=22879" target="_blank">drBatty</a>
./index.php?showtopic=128553&pid=1182532&st=0&:953:<!--coloro:#000000--><span style="color:#000000"><!--/coloro-->¡<!--colorc--></span><!--/colorc--> <!--coloro:#FF0000--><span style="color:#FF0000"><!--/coloro-->Страсть<!--colorc--></span><!--/colorc--><!--coloro:#FF8C00--><span style="color:#FF8C00"><!--/coloro--> к <!--colorc--></span><!--/colorc--><!--coloro:#FFFF00--><span style="color:#FFFF00"><!--/coloro-->разрушению<!--colorc--></span><!--/colorc--> <!--coloro:#9ACD32--><span style="color:#9ACD32"><!--/coloro-->есть<!--colorc--></span><!--/colorc--> <!--coloro:#4169E1--><span style="color:#4169E1"><!--/coloro-->творческая<!--colorc--></span><!--/colorc--> <!--coloro:#DDA0DD--><span style="color:#DDA0DD"><!--/coloro-->страсть<!--colorc--></span><!--/colorc-->!
./index.php?showtopic=128553&pid=1182532&st=0&:1063:=
./index.php?showtopic=128553&pid=1182532&st=0&:1167:Автор темы
./index.php?showtopic=128553&pid=1182532&st=0&:1350:1
./index.php?showtopic=128553&pid=1182532&st=0&:1351:0
./index.php?showtopic=128553&pid=1182532&st=0&:1511:Текстовая версия
./index.php?showtopic=128553&pid=1182532&st=0&:1550:ровно!
./index.php?showtopic=128553&pid=1182532&st=0&:1553:ровно!
./index.php?showtopic=128553&pid=1182532&st=0&:1555:"+_y+"
./index.php?showtopic=128553&pid=1182532&st=0&:1556:"+_m+"
./index.php?showtopic=128553&pid=1182532&st=0&:1558:"+_d+"
./index.php?showtopic=128553&pid=1182532&st=0&:1560:"+_y+"
./index.php?showtopic=128553&pid=1182532&st=0&:1561:"+_m+"
./index.php?showtopic=128553&pid=1182532&st=0&:1562:"+_d+"кстати, админы, а что вы криво файлы составили?
почему страницы НЕ заканчиваются символом \n ???
Вы их что, в блокноте правите?! Из-за этого приходится скрипт усложнять - исправлять ваши ошибки :(
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: sed и вывод пути до файла
Мы не правим страницы вообще. Их генерирует движок. Да, да, пора бы уже перейти на другой, я знаю, можно не напоминать.
А к слову об усложнении скрипта - если он обрабатывает данные, которые создавали не вы, то он должен быть готов ко всему: нестандартные концы строк, отсутствие концов строк вообще, недопустимые в заявленной кодировке последовательности байтов и т.д.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed и вывод пути до файла
но генерирует по шаблонам. А кто правит шаблоны?
/dev/random писал(а): ↑22.09.2011 10:54А к слову об усложнении скрипта - если он обрабатывает данные, которые создавали не вы, то он должен быть готов ко всему: нестандартные концы строк, отсутствие концов строк вообще, недопустимые в заявленной кодировке последовательности байтов и т.д.
я-то готов. но тут вовсе не "нестандартный конец строки", а вообще отсутствие последней строки, если принимать за определение строки
последовательность символов оканчивающихся символом "конец строки"
У вас посл. строка вообще не кончается, а обрывается на EOF.
/dev/random писал(а): ↑22.09.2011 10:54Да, да, пора бы уже перейти на другой, я знаю, можно не напоминать.
...да и кодировка cp1251 - не комильфо... Это всё-же UNIXforum, а не винфак ;)
По теме - есть ещё один вариант:
1. делаем шаблон типа:
Код: Выделить всё
#!/bin/sed -rnf
s/.*%BEGIN%(.*)%END%.*/%FILENAME%:\1/p2. Ищем файлы, когда находим, меняем в шаблоне %FILENAME% на имя заданного файла.
3. Запускаем получившийся из шаблона скрипт с файлом в качестве параметра.
Такой способ будет работать быстрее если файлы большие.
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: sed и вывод пути до файла
Во-первых, они правятся через админку, в браузере. Как, куда и в каком формате их сохраняет движок - его дело. Во-вторых, в HTML нет понятия "строка", вне специальных контекстов (например, атрибутов в тегах) все пробельные символы равнозначны. Это поток символов, а не строк. В-третьих, тема не об этом.
-
LittleJohn
- Сообщения: 5
Re: sed и вывод пути до файла
Grih65kop писал(а): ↑22.09.2011 00:19Код: Выделить всё
grep -o 'abc\=.*\ cba' ./*
Вывод:
./1file.txt:abc=QQWWEERRTT cba
./2file.txt:abc=TTRREEWWQQ cba
./3file.txt:abc=AASSDDFFGG cba
если бы в этом выводе было бы только то что находится между "abc=" и "cba", то он бы полностью меня устраивал.
Код: Выделить всё
grep -oP '(?<=abc=).*(?= cba=)' *txt1file.txt:QQWWEERRTT
2file.txt:TTRREEWWQQ
3file.txt:AASSDDFFGG
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed и вывод пути до файла
а разве там нету возможности править шаблоны в нормальном текстовом редакторе? В phpBB есть. Вроде и в этом была такая фича (скорее фича - правка из браузера).
/dev/random писал(а): ↑22.09.2011 13:59Во-вторых, в HTML нет понятия "строка", вне специальных контекстов (например, атрибутов в тегах) все пробельные символы равнозначны. Это поток символов, а не строк.
угу. я знаю. потому обычно прогоняю HTML(XML, etc) через предварительный фильтр, который режет и клеит строки.
Возможно. А может и нет. Если ТС решил распарсить HTML sed'ом, то он должен быть готов к этим "приятным" неожиданностям...
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: sed и вывод пути до файла
Проверил. Шаблоны хранятся в БД, в таблице *_skin_templates.
drBatty писал(а): ↑22.09.2011 14:11/dev/random писал(а): ↑22.09.2011 13:59Во-вторых, в HTML нет понятия "строка", вне специальных контекстов (например, атрибутов в тегах) все пробельные символы равнозначны. Это поток символов, а не строк.
угу. я знаю. потому обычно прогоняю HTML(XML, etc) через предварительный фильтр, который режет и клеит строки.
Знаете. Тогда почему же говорите, будто отсутствие перевода строки - ошибка?
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed и вывод пути до файла
хм.. В phpBB шаблоны хранятся и в файлах, и в БД. Править их можно и там и там, но я предпочитаю править файлы, ибо в браузере не самый лучший текстовый редактор...
/dev/random писал(а): ↑22.09.2011 14:28Знаете. Тогда почему же говорите, будто отсутствие перевода строки - ошибка?
потому, что я считаю(правильно?), что HTML == текстовый файл. Причём тот факт, что элементы разметки могут находится в разных строках, а так-же то, что одна строка из HTML не обязательно выводится как одна строка на экране, вовсе не отменяет этот факт. Но HTML файл, который отдаёт ваш движок НЕ является текстовым файлом.
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: sed и вывод пути до файла
В phpBB шаблоны хранятся в файлах и кэшируются в базе. В IPB - наоборот. При этом, полагаю, не нужно объяснять, что редактировать кэш - глупо?
drBatty писал(а): ↑22.09.2011 14:39потому, что я считаю(правильно?), что HTML == текстовый файл. Причём тот факт, что элементы разметки могут находится в разных строках, а так-же то, что одна строка из HTML не обязательно выводится как одна строка на экране, вовсе не отменяет этот факт. Но HTML файл, который отдаёт ваш движок НЕ является текстовым файлом.
"Текстовый файл" - двусмысленное понятие. Если вы имеете в виду, что этот формат предназначен для хранения текста, то да, предназначен. Если вы имеете в виду, что это plain-text, то нет, это не plain-text.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed и вывод пути до файла
/dev/random писал(а): ↑22.09.2011 15:22В phpBB шаблоны хранятся в файлах и кэшируются в базе. В IPB - наоборот. При этом, полагаю, не нужно объяснять, что редактировать кэш - глупо?
ЕМНИП в phpBB шаблоны хранятся в файлах (базовые), в базе (изменяются в админке), и ещё и в кеше (тоже файлы, изменяются сами по себе).
/dev/random писал(а): ↑22.09.2011 15:22"Текстовый файл" - двусмысленное понятие. Если вы имеете в виду, что этот формат предназначен для хранения текста, то да, предназначен. Если вы имеете в виду, что это plain-text, то нет, это не plain-text.
для вас - двусмысленное, для меня - однозначное: текстовый файл - последовательность строк. Строка - последовательность символов, которая завершается символом "перевод строки" (последний разный в разных системах, но он всегда есть). Если, кроме того, все символы из ASCII, то файл является plain-text'ом. Если нет - это обычный текстовый файл. Данное определение подходит не только для файла, но и для текстового потока. Ваши файлы не подходят под это определение, потому редактор (sed) работает неправильно.
/dev/random писал(а): ↑22.09.2011 10:54недопустимые в заявленной кодировке последовательности байтов и т.д.
это тоже не подходит под моё определение - недопустимая последовательность байтов == НЕСИМВОЛ => не строка => не текст.
Определение далеко не искусственно - sed(и другие утилиты) может работать с текстовым файлом/потоком, но не с чем-то, что не является текстовым файлом/потоком. Как например странички на этом форуме.
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: sed и вывод пути до файла
Возможно, я уже забыл. Последний раз я имел дело с phpBB года 3 назад, может, больше. Поверю вам на слово.
Если брать такое определение, то HTML _не является_ текстовым файлом. При этом множества "HTML" и "текстовый файл по вашему определению" пересекаются, но ни одно не является подмножеством другого.
drBatty писал(а): ↑23.09.2011 07:39это тоже не подходит под моё определение - недопустимая последовательность байтов == НЕСИМВОЛ => не строка => не текст.
Определение далеко не искусственно - sed(и другие утилиты) может работать с текстовым файлом/потоком, но не с чем-то, что не является текстовым файлом/потоком. Как например странички на этом форуме.
А это уже не имеет отношения к определениям. Это вопрос безопасности. Независимо от входных данных, программа не имеет права скатываться к непредсказуемому поведению.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed и вывод пути до файла
/dev/random писал(а): ↑23.09.2011 07:54Если брать такое определение, то HTML _не является_ текстовым файлом.
скорее, HTML _может_ не являться текстовым файлом - стандарт это позволяет.
На самом деле, стандарты многое позволяют, например в C _можно_ писать x-- - --x;, это по стандарту _допустимо_, и по нему-же ведёт к неопределённости. Вопрос: а надо-ли такое писать IRL? Формально - это не ошибка, тут вы правы, однако на практике, вы создаёте сложности всем тем, кто работает с этим форумом не только через браузер. В т.ч. и себе.
[offtopic]кстати, а что вы не хотите перевести форум в UTF-8?[offtopic]
/dev/random писал(а): ↑23.09.2011 07:54А это уже не имеет отношения к определениям. Это вопрос безопасности. Независимо от входных данных, программа не имеет права скатываться к непредсказуемому поведению.
тут другой случай: поведение RE (не только sed, а вообще glibc) вполне предсказуемое, мало того, ещё и подчиняется стандарту (ЕМНИП). Другое дело, оно несколько неожиданное - точка совпадает с любым СИМВОЛОМ, но она вовсе не обязана совпадать с НЕСИМВОЛОМ. Как я понял, совсем наоборот - обязана НЕ совпадать. Она и не совпадает. Потому поведение программ вполне предсказуемо, хотя и неожиданно. Ну и кроме того, декларируется корректная работа с текстом, причём _текст_ именно по моему определению, а в ситуации "мусор на входе" имеем "мусор на выходе", и это вполне нормальная (ИМХО) ситуация.
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: sed и вывод пути до файла
drBatty писал(а): ↑23.09.2011 09:38скорее, HTML _может_ не являться текстовым файлом - стандарт это позволяет.
На самом деле, стандарты многое позволяют, например в C _можно_ писать x-- - --x;, это по стандарту _допустимо_, и по нему-же ведёт к неопределённости. Вопрос: а надо-ли такое писать IRL? Формально - это не ошибка, тут вы правы, однако на практике, вы создаёте сложности всем тем, кто работает с этим форумом не только через браузер. В т.ч. и себе.
Во-первых, HTML, не являющийся текстовым файлом (по вашему определению), к неопределённости не ведёт, в отличие от конструкции `x-- - --x`. Во-вторых, для HTML следует использовать средства, которые действительно предназначены для работы с ним, и не полагаются на особенности, не требующиеся стандартом. Например, xsh. В-третьих, как я уже говорил, сохранением шаблонов занимается движок, и ради такой мелочи нырять в очередной раз в эту цистерну говнокода меня как-то не тянет.
Почему вы решили, что не хочу? Это ещё MadDog, насколько я помню, пытался сделать. К сожалению, эта версия движка имеет кучу багов в работе с utf-8. Есть новая, несовместимая с этой, но если уж менять движок, то лучше сразу на что-нибудь свободное.
Я как раз об этом. "Мусор на выходе - мусор на выходе" - ущербный подход. Если на входе мусор, то на выходе должно быть корректное и безопасное сообщение об ошибке, а не мусор. К примеру, вы помните обсуждение насчёт sed, битого utf-8 и команды e? О том, что текст, содержащий не-символы, sed может неожиданно оставить как есть (вы только что ещё раз описали, почему), и если скрипт использует, к примеру, команду e, то ей при этом будет передан необработанный текст, автоматически делая скрипт одной большой уязвимостью? Вот оно, следствие подхода "мусор на входе - мусор на выходе".
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed и вывод пути до файла
/dev/random писал(а): ↑23.09.2011 10:12Во-первых, HTML, не являющийся текстовым файлом (по вашему определению), к неопределённости не ведёт
с т.з. FireFox'а - да, не ведёт. С точки зрения UNIX-Like утилит - ведёт. Сложно сказать, как будет обработана оборванная последняя строка какой-то утилитой. Например старые версии crond'а такой строки просто не видели, а новые - видят. Разве это не неопределённость? В рассматриваемом случае, утилита cat строку выводит, проблема в том, что _следующая_ строка (имя следующего файла) склеивается с текущей. В итоге, sed обрабатывает две строки как одну. ИЧСХ никто не виноват - cat правильно выполняет свою работу (у неё работа - что вижу, то и пою), sed тоже всё делает правильно, но в итоге, имя файла съедается, и мне приходится насильно вставлять этот перевод строки, которого нет в "тексте". Ну и кроме того, мне приходится применять дополнительные меры что-бы обработать тот случай, когда перевод строки вставлен неправильно (если вы таки исправили формат, или если это первый файл).
/dev/random писал(а): ↑23.09.2011 10:12Во-вторых, для HTML следует использовать средства, которые действительно предназначены для работы с ним, и не полагаются на особенности, не требующиеся стандартом.
не обязательно - как я уже говорил, достаточно предварительной фильтрации. УМВР.
/dev/random писал(а): ↑23.09.2011 10:12В-третьих, как я уже говорил, сохранением шаблонов занимается движок, и ради такой мелочи нырять в очередной раз в эту цистерну говнокода меня как-то не тянет.
да... я счастлив, что мне не приходилось править этот ваш IBP уже полтора года. Надеюсь - не придётся ещё столько-же :)
/dev/random писал(а): ↑23.09.2011 10:12Почему вы решили, что не хочу? Это ещё MadDog, насколько я помню, пытался сделать. К сожалению, эта версия движка имеет кучу багов в работе с utf-8. Есть новая, несовместимая с этой, но если уж менять движок, то лучше сразу на что-нибудь свободное.
ждём...
/dev/random писал(а): ↑23.09.2011 10:12Я как раз об этом. "Мусор на выходе - мусор на выходе" - ущербный подход. Если на входе мусор, то на выходе должно быть корректное и безопасное сообщение об ошибке, а не мусор. К примеру, вы помните обсуждение насчёт sed, битого utf-8 и команды e? О том, что текст, содержащий не-символы, sed может неожиданно оставить как есть (вы только что ещё раз описали, почему), и если скрипт использует, к примеру, команду e, то ей при этом будет передан необработанный текст, автоматически делая скрипт одной большой уязвимостью? Вот оно, следствие подхода "мусор на входе - мусор на выходе".
на практике я тоже НЕ использую команду e, я использую команду s///e. Она отличается тем, что в ситуации "мусор на входе" не происходит ни замены, ни тем более исполнения, что во первых безопасно, а во вторых легко отслеживается, т.к. флаг перехода не будет установлен (конечно условие должно быть очень жёстким). Вот тут-то и нужно передать управление на вывод сообщения об ошибке, или на обработку особого случая. И даже если этого не сделать, то злоумышленник всё равно не сможет выполнить вредоносный код.