Переведи меня нежно

heider
А так нельзя? … tr -d '\n'
Если использовать данный фильтр (например, удаляем все лишние пробелы, а затем используем tr -d '\n' или tr '\n', ' '), типа
TextIn="$(xsel -o | sed 's/  */ /g' | tr '\n', ' ')"
то получаем следующий перевод
ОПИСАНИЕ Утилита awk выполняет программы, написанные на языке программирования awk, который специализируется на манипулировании текстовыми данными. Программа awk - это последовательность шаблонов и соответствующих действий. Когда считывается ввод, соответствующий шаблону, выполняется действие, связанное с этим шаблоном.
Все в один абзац, что не есть хорошо - представь, имеем несколько абзацев/перечислений через - (тире) ... и все сольется в один абзац.
А вот если удалить только в нужных местах, то не нужно применять утилиту tr и получим типа такого
ОПИСАНИЕ
       Утилита awk выполняет программы, написанные на языке программирования awk, который специализируется на манипулировании текстовыми данными. Программа awk - это последовательность шаблонов и соответствующих действий. Когда считывается ввод, соответствующий шаблону, выполняется действие, связанное с этим шаблоном.

Это недостаток man ... и также присутсвует в pdf, но там проявляется иногда еще в большей степени. Это хорошо зметно, если посмотреть на кусок текста по другому
0000070   p   e   c   i   a   l   i   z   e   d  \n
0000080           f   o   r       t   e   x   t   u   a   l       d   a
символ \n здесь в принципе не нужен - логически здесь строка не заканчивается, а если смотреть по другому, то это будет менее понятно
00000070  70 65 63 69 61 6c 69 7a  65 64 0a 20 20 20 20 20  |pecialized.     |
00000080  20 20 66 6f 72 20 74 65  78 74 75 61 6c 20 64 61  |  for textual da|
здесь символ \n изображен как hex код 0a, а дальше идет 6 лишних пробелов ( hex код 20)
Возможно я хреново объясняю, многие мне об этом говорят ...

PS - а вообще мне в байтах все более понятнее и проще - когда что то до меня не доходит, перехожу на уровень байтов.

EDIT 1 - похоже слишком замутил и лучше в эти дебри не углубляться, а оставить все как есть. .... возможно red что то замутит на awk ...
Ошибки не исчезают с опытом - они просто умнеют
heider
А так нельзя?
tr -d '\n'
И да - это похоже единственный вариант - не получится просто определить, что конкретно нужно удалять . Пример
DESCRIPTION
       The  awk  utility ...
А вот так этот кусок выглядит в байтах
00000000  44 45 53 43 52 49 50 54  49 4f 4e 0a 20 20 20 20  |DESCRIPTION.    |
00000010  20 20 20 54 68 65 20 20  61 77 6b 20 20 75 74 69  |   The  awk  uti|
И видим после DESCRIPTION туже комбинацию байтов (0a 20 20 20 20 20 20), которая может удалится - не возможно ее отличить от другого такого же куска.

Вывод - оставил у себя вариант TextIn="$(xsel -o | sed 's/ */ /g' | tr -d '\n')" ... и забыл об этом ...
Ошибки не исчезают с опытом - они просто умнеют
vasek, sed и awk вряд ли подойдут. Они для построчной обработки хорошо подходят. А здесь нужно объединять строки, да еще и не всякие. Я примерно представляю, как это сделать на СИ: исключать символ 0a, если за ним после нескольких пробелов и табуляций следует строчная буква, но в баше не силен, поэтому - тоже сдаюсь. :)
heider
sed и awk вряд ли подойдут
Да это здесь не пойдет ... что я вижу, так это скрипт, но не строчное, а побайтовое чтение файла/текста (или если построчное, то нужно строку переводить к виду HEX, к последовательности байт) и ряда условий проверки, но это уже не то ... а потому даже не стал и пытаться, забросил.
Ошибки не исчезают с опытом - они просто умнеют
sed загружает строку для обработки без \n. Символ \n добавляется при выводе или многострочной обработке, например, команда N:
[anode@TM-8481 ~]$ sed -re 'N; s/\n/\t/'
asdfgh
zxcvbn
asdfgh  zxcvbn
для сложных фильтров, имхо, запускать в программе sed -rf myfiltr.sed, а сам фильтр помещать в файл
anode
sed загружает строку для обработки без \n.
Полностью согласен - sed читает по одной строке за раз и отсекает завершающий символ перевода строки (в дальнейшей обработке этот символ не участвует).
Но я считал, что раз sed понимает и видит этот символ, то значит может его обрабатывать ... но все мои попытки с обработкой этого символа (удаление, замена) безуспешны … и решил, что только использование tr поможет в этом.
Но, не успокоился на этом и продолжил поиски, чтобы понять - может ли sed обрабатывать символ \n ?… и поиски увенчались успехом - sed все-таки умеет обрабатывать этот символ.
Сейчас вместо используемой конструкции
TextIn="$(xsel -o | sed 's/  */ g' | tr '\n', ' ')"
прописал следующую конструкцию, без привлечения утилиты tr
TextIn="$(xsel -o | sed ':a;N;$!ba;s/\n/ /g')"

PS - результат тот же (... но плохо то, что все вместе ...)

EDIT 1 - привожу аналог и для awk (может пригодится red) - awk 1 ORS=' ' - как всегда, намного лаконичнее ...
Ошибки не исчезают с опытом - они просто умнеют
vasek
намного лаконичнее
Если уж говорить о лаконичности, то можно и вот так:
TextIn="$(echo `xsel -o`)"
и лишние пробелы с табуляциями заберет, и перевод строки останется только один в самом конце.
heider
TextIn="$(echo `xsel -o`)"
точно - один в один - прописал и этот вариант.
Но не понятно, почему дает такой результат ...
-o, --output          Write the selection to standard output

PS - и эта констукция хорошо работает в данном случае, но не всегда ее можно применить ...
Ошибки не исчезают с опытом - они просто умнеют
vasek
Но не понятно, почему дает такой результат
Потому что echo в такой конструкции воспринимает вход не как один аргумент в виде большой строки, а как множество аргументов, состоящих из отдельных слов, разделенных разделителями (пробелами, табуляциями, переводами строк), и выводит на вывод все эти прочитанные аргументы ввиде списка через пробел. Но стоит заключить входящую строку в кавычки
echo "`xsel -o`"
и на выход пойдет вся строка целиком вместе с лишними пробелами, табуляциями и переводами строк.
Можно так протестировать.
Три коротких аргумента
$ echo несколько      разных      слов
несколько разных слов
Один длинный аргумент
$ echo "несколько      разных      слов"
несколько      разных      слов
 
Зарегистрироваться или войдите чтобы оставить сообщение.