LINUX.ORG.RU

Есть ли в nix* НЕ построчный потоковый редактор?

 , ,


2

1

насколько я понимаю, например в sed я не могу бескостыльно сматчить паттерны вне зависимости от строк? То есть, строки содержащие паттерн я могу сматчить как то так sed -rn '/foo/p' file, а чтобы сматчить отдельные слова мне нужно это делать уже через реплейс. Или, допустим, я захотел сматчить блок текста независимый от строк и переносов. В общем, как обычно работает match в языках программирования, есть такой инструмент?



Последнее исправление: linearisation (всего исправлений: 1)

Ответ на: комментарий от Zmicier

я спрашивал инструмент абстрагированный от строк. через поиск строк и последующюю замену в них можно это все и в сед сделать, нужно чтобы напрямую, допустим, сразу сматчить кусок текста, независимо от переносов.

linearisation
() автор топика

Классика же:

sed ':a;N;$!ba;s/\n/ /g'

:a;N;$!ba; - делает из файла одну большую строку внутри sed, а потом её можно матчить или делать в ней замены, например, как в примере - заменить все \n на пробелы.

Stanson ★★★★★
()
Ответ на: комментарий от linearisation

с чего бы это?

С того, что это не работает с потоком.

«:a;N;$!ba; - делает из файла одну большую строку внутри sed».

потока символов, типа, быть не может?

?

Zmicier ★★★★★
()
Ответ на: комментарий от Stanson

Мне? Мне здесь ничего не надо. Это товарищу linearisation зачем-то нужен накопительно-поточный редактор — что читал бы посимвольно (?) и накапливал в буфере до совпадения. Произвольное указание границы обрабатываемого за раз — как в том же АВКе — его почему-то не устраивает. Ну или он об’яснять не умеет.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)
Ответ на: комментарий от linearisation

AWK.

гугл выдает:
интерпретируемый скриптовый C-подобный язык построчного разбора и обработки входного потока

При этом по файлу он гулять тоже могет. В построчном режиме просто писанины меньше и дял unix-way оно пригождается чаще.

antares0 ★★★★
()
Ответ на: комментарий от Zmicier

так я не про то, я говорю, что абстракция потока не обязана относится обязательно к строке. ЕМНИП, на PDP был посимвольный поточный редактор TECO. Вообще, единицей там может быть все что угодно

linearisation
() автор топика
Ответ на: комментарий от antares0

так, вроде, по файлу гулять может вообще любой unix редактор: ed, ex, например. В тоже время, все таки, awk — для поиска и замены текста, слишком жирно целый язык изучать:)

linearisation
() автор топика
Ответ на: комментарий от linearisation

Вообще, единицей там может быть все что угодно

Если вам нужен язык для поточной обработки с произвольной границей блока, поставляющийся в большинстве юникс-подобных систем, то я вам уже ответил первым же письмом.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

и накапливал в буфере до совпадения

ты хочешь сказать, что в потоке строк текст буферизуется построчно, по принципу «один буфер - одна строка»?

linearisation
() автор топика
Ответ на: комментарий от linearisation

так, вроде, по файлу гулять может вообще любой unix редактор: ed, ex, например

s/unix //

Zmicier ★★★★★
()
Ответ на: комментарий от linearisation

Нет, вот эти слова я точно не хотел говорить.

Zmicier ★★★★★
()

Лучше приведи пример текста и результат, который нужно получить. Без реального юз кейса вся эта демагогия ни к чему не приведет.

surefire ★★★
()
Ответ на: комментарий от antares0

И напомните, пожалуйста, как там погулять по файлу?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Насколько я понял из объяснения ТС - ему надо в текстах (типа книги) найти некую фразу, которая запросто может оказаться разделённой на 2 строки и с переносами.

Может я и неправильно понял, но тогда ТСу надо более конкретно задачу описать.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Насколько я понял из объяснения ТС - ему надо в текстах (типа книги) найти некую фразу, которая запросто может оказаться разделённой на 2 строки и с переносами.

Если так, то ответ в первом письме.

Zmicier ★★★★★
()
Ответ на: комментарий от linearisation

Ну тогда ответ - да, таки можно sed'ом воспользоваться для решения этой задачи, согласно вышезапощенному примеру. :)

Суть решения - слепить весь текст в одну гигантскую строку, удалить все пробелы и переносы и искать в этой гигантской строке искомое, также исключив пробелы и пр. из паттерна.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Суть решения - слепить весь текст в одну гигантскую строку

Какой «весь текст», когда фильтр по условию *поточный* — должен работать с бесконечным текстом.

Zmicier ★★★★★
()
Ответ на: комментарий от surefire

ну, допустим, есть некий файл, где есть кусок "...foo\n100bar..." и надо сматчить foo\n100bar по паттерну «foo[\s\S]*?bar», где [\s\S] — произвольный символ, включая перенос строки

linearisation
() автор топика
Ответ на: комментарий от linearisation

ну, допустим, есть некий файл, где

Разделителем записей-то что является, если не конец строки? Ну, допустим пустая строка.

foo[\s\S]*?bar
*?
?

Не, нежадные регулярки — это только начиная с PCRE. А так, очевидно, что-то примерно такое:

$ gawk -v RS='\n\n' 'match ($0, /foo.*bar/, a) { print (a[0]) }'
Zmicier ★★★★★
()
Ответ на: комментарий от linearisation

Никаких допустим. Текст на входе текст на выходе.
[\s\S] - это что за бредни наркомана, не проще использовать точку?

surefire ★★★
()
Ответ на: комментарий от Zmicier

Разделителем записей-то что является, если не конец строки? Ну, допустим пустая строка.

в моем представлении, разделитель записей явный — это не обязательное условие для потока. Разделителем можно считать конец сматченного выражения.

linearisation
() автор топика
Ответ на: комментарий от Zmicier

В заголовке.

И как это соотносится с задачей ТС? Решение его задачи не зависит от потоковости редактора.

Вот если бы ему надо было искать в бесконечном тексте, который поступает откуда-то из сети - тогда да, твои аргументы были бы вполне резонны. А для поиска фразы в файле с книжкой потоковость совершенно не обязательна.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

И как это соотносится с задачей ТС?

Какой задачей? Он не ставил никакой внятной задачи.

поточность совершенно не обязательна.

Но по условию-то она есть!

Zmicier ★★★★★
()
Ответ на: комментарий от linearisation

разделитель записей явный — это не обязательное условие для потока. Разделителем можно считать конец сматченного выражения.

То есть парсер должен быть накопительным. Я навскидку готовой утилиты с таковым не назову. А так — здесь нет ничего невозможного — флаг вам в руки.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Какой задачей? Он не ставил никакой внятной задачи.

Я, как оказалось, даже угадал, что именно ему нужно. Так что хоть и невнятно, но таки задачу он описал. :)

Но по условию-то она есть!

Но, как оказалось, для решения задачи ТС не нужна. :)

Stanson ★★★★★
()
Ответ на: комментарий от Zmicier

точка в регулярных выражениях означает буквально: любой символ кроме перевода строки. В некоторых имплементациях это значение можно переопределить флагами, но это к делу не относится

linearisation
() автор топика
Ответ на: комментарий от linearisation

точка в регулярных выражениях означает буквально: любой символ кроме перевода строки

ЛПП.

9.3.4 Periods in BREs

A <period> ( '.' ), when used outside a bracket expression, is a BRE
that shall match any character in the supported character set except
NUL.

— POSIX.1-2008

9.4.4 Periods in EREs

A <period> ( '.' ), when used outside a bracket expression, is an ERE
that shall match any character in the supported character set except
NUL.

— ibid

'.' (period)
     This matches any single character, _including_ the newline
     character.  For example, '.P' matches any single character followed
     by a 'P' in a string.  Using concatenation, we can make a regular
     expression such as 'U.A', which matches any three-character
     sequence that begins with 'U' and ends with 'A'.

— (info "(gawk) Regexp Operators")

В некоторых имплементациях это значение можно переопределить флагами

Да.

Zmicier ★★★★★
()

Строка это \n что-ли? Файл он и есть файл, если ты его читаешь, то перевод строки это как дополнительный символ в потоке других, возможно разделяющий слова на части

minakov ★★★★★
()

expect - не редактор, но матчит именно так.

DonkeyHot ★★★★★
()
Ответ на: комментарий от linearisation

есть кусок "...foo\n100bar..." и надо сматчить foo\n100bar по паттерну «foo[\s\S]*?bar», где [\s\S] — произвольный символ, включая перенос строки

echo -e "goofoo\n100barbaz" | grep --color=auto -Pz '(?s)foo[\s\S]*?bar'
i-rinat ★★★★★
()
Ответ на: комментарий от linearisation

точка в регулярных выражениях означает буквально: любой символ кроме перевода строки.

Где конкретно это так?

ashot ★★★★
()

grep -z (для GNU).

для разделения - internal variables, конкретно IFS. используется неявно почти во всех утилитах. разделитель, соответственно, можно установить в любое значение и не страдать.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 2)

`awk` уже вспомнили, в нём можно указать разделитель записей и разделитель полей в записях

ещё можно посмотреть `sgrep`, который предназначен для работы с многострочными текстовыми структурами в том числе

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.