LINUX.ORG.RU

Фильтрация пайпа с посимвольным чтением

 , ,


0

1

Столкнулся с задачей фильтрации потока, но читая его не построчно, а посимвольно. Поэтому все grep -v, sed, rt не подходят. Собственно, вопрос - есть ли какая готовая утилита или мне писать свою?


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

На входе - все что из стдина, на выходе - с удаленными/земененными некоторыми символами/строками. Но при этом читая стдин не построчно, а посимвольно (не scanf а getchar)

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

на выходе - с удаленными/земененными некоторыми символами/строками

Как нужно удалять/заменять?

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

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

Замена несложная, могу захардкодить, это не проблема. Пока встрял даже с просто прозрачной передачей входного потока посимвольно - читаю в цикле пока while ((ch = getchar()) != EOF) putchar(ch); но все равно ждет символа конца ввода строки из стдина, если ничего не путаю. Хотя если запускаю producer | cat все хорошо…

Ivana
() автор топика
Последнее исправление: Ivana (всего исправлений: 1)
Ответ на: комментарий от Ivana

Ну так вы напишите конкретно, что вы хотите получить и почему вас не устраивает, например, такое решение.

#include <stdio.h>
#include <stdlib.h>

int main() {
    int ch;
    while ((ch = getc(stdin)) != EOF) {
        putc(ch, stdout);
    }
}

Я подозреваю, что вы хотите получать мгновенный отклик (т.е. нажав «а», сразу получить соответствующий вывод), а не устраивает вас буферизация строк в терминале. Если это так, то вам просто нужно ее отключить. Советую осилить эту замечательную статью.

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

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

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

Но при этом читая стдин не построчно, а посимвольно

tr читает просто сколько может и сразу выводит, там нет особой обработки строк. Но stdio, которым он это делает, будет буферизовать либо строками, если вывод на терминал, либо по нескольку килобайт, если вывод в файл.

Тебе, скорее всего, нужно убрать буферизацию у tr и ещё у программы, от которой tr получает данные. Для обоих случаев есть утилита stdbuf:

stdbuf -o0 your-output-generator | stdbuf -i0 -o0 tr 'a' 'B'
i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Спасибо за подсказку как отключать буферизацию в строке запуска. Я вызвал в своем си-коде setbuf(stdin, NULL); и это помогло, написал собственный буфер и логику, все работает. Сейчас пытаюсь гуглить почему иногда при большом вводе в программу-продьюсер моего вывода, она показывает эхо ввода криво, причем непредсказуемо - перескакивают и дублируются части строк, добавляются явно ^M и т.п. Подозреваю что надо какие-то настройки stty подкрутить.

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

а посимвольно

 $ 'йцукен'.ToCharArray()
й
ц
у
к
е
н
anonymous
()
Ответ на: комментарий от i-rinat

есть утилита stdbuf

прикольно. спасибо.

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