Intereting Posts
Как обеспечить, чтобы эхо в файл было очищено? Сетевой блок после перезапуска Пакетный файл перемещается в структуру каталогов на основе имени файла Отправлять электронную почту, если пользователь обращается к серверу через ssh Могу ли я использовать один и тот же двоичный файл в Linux, * BSD и Illumos? Скопируйте все папки в новое место, кроме тех, которые содержат недопустимые символы. Компиляция клиента OpenSSH или Dropbear для Android Внутренний громкоговоритель не горит, когда я нажимаю кнопки увеличения и уменьшения громкости на наушниках Обслуживание веб-страниц с Apache на сервере Ubuntu Daemon – как рассказать начальному демонам выполнить этот демон как другое имя пользователя, чем root? Как настроить домашнюю маршрутизацию ipv6? Можно ли открыть терминал с указанными tty / pty конвертировать временную метку в форматированное время OSX Как скачать видео с Coursera с curl? Какой дистрибутив Linux хорош для музыки и хорошо поддерживается?

Обработка разделов текстового streamа, разделенных ␁

Как я могу разделить файловый stream на stdin на более мелкие разделы, каждый из которых передается в скрипт,

У меня есть большой файл на стандартный stdin который напоминает …

 ␁HeadingHere abcd abcd ␁Different Title bcde bcde {a lot longer} ␁Different again! cdef cdef 

Я после способа передачи каждого из этих разделов ./script.sh

который бы симулировал:

 cat <<EOF | ./script.sh ␁HeadingHere abcd abcd EOF 

 cat <<EOF | ./script.sh ␁Different Title bcde bcde {a lot longer} EOF 

 cat <<EOF | ./script.sh ␁Different again! cdef cdef EOF 

Каждый раздел может быть определен разделением .

Я подумал об использовании xargs и делал что-то по аналогии с xargs -d '\01' -n1 echo но столкнулся с xargs: argument line too long

В идеале скрипт должен быть posix совместимым

Вы можете разделить разделы на отдельные файлы и обработать их один за другим. Это будет производить outfile.1 т. Д .:

 awk '/^␁/ { count++ } { print > "outfile." count } ' < file 

Или вы можете использовать awk передачи разделов по очереди команде:

 awk 'BEGIN {command = "./script.sh"} /^␁/ { close(command) } { print | command } ' < file 

Я использовал буквальный U + 2401 СИМВОЛ ДЛЯ НАЧИНАЮЩЕЙ ГОЛОВКИ в вышеприведенном тексте, так как это то, что мне дало копирование. Вы использовали \01 в командной строке xargs , так что, если это то, что у вас есть, измените закорочение SOH на фактический START OF HEADING, \001 в коде awk тоже.


Мы также могли бы установить RS на SOH, но это не совсем точно, так как здесь у нас есть SOH в начале записи, и awk ожидает найти разделитель записей в конце.

Если исходный файл не имеет пустых строк (две последовательные строки новой строки), вы можете преобразовать каждую из в две строки новой строки с помощью sed. Это создаст файл (или stream) с пустой строкой в ​​качестве разделителя каждой записи. Затем awk (с пустым RS) может разделить каждый файл (stream) с разделителями «пустой строкой» на «записи».

Описание может показаться сложным, но посмотрите на код:

 sed 's/␁/\n\n/g' file | awk -v RS='' -vf="./script" '{print|f;close(f)}' 

Если вам действительно нужно преобразовать символ с байтовым значением 0x01, замените на \x01 в команде sed.