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

Вот такой набор палочек и букв s должен убирать все пробельніе символы в начале и конце строки, заменять все пробельные символы между словами на один пробел, удалять пустые строки, если ни где не ошибся.
[anode@TM-8481 ~]$ sed -re 's/^\s+//; s/\s+$//; s/(\S+)\s{2,}(\S+)/\1 \2/; /^$/d'

ЗЫ.
sed -re 's/^\s+//; s/\s+$//; s/\s{2,}/ /g; /^$/d'
Пример работы
[anode@TM-8481 ~]$ cat tagsed

 t                              lab
:lab
             s/aa/Z/
        T                isf
 a      aaa
  :isf
 b                            lab
[anode@TM-8481 ~]$ sed -re 's/^\s+//; s/\s+$//; s/(\S+)\s{2,}(\S+)/\1 \2/; /^$/d' tagsed
t lab
:lab
s/aa/Z/
T isf
a aaa
:isf
b lab
anode, не совсем то, что нужно. Не удаляется символ "│". Вот пример перевода help из make menuconfig, пропущенного через Ваш фильтр:
Если вы хотите использовать устройства, подключенные к параллельному порту вашей машины │ │ (разъем на компьютере с 25 отверстиями), например, принтер,
ZIP │
│ диск, PLIP-канал (параллельный Интернет-протокол в основном используется для mini │ создания мини-сети путем подключения параллельных портов двух локальных │ │ машин) и т. Д., Затем необходимо сказать Y; пожалуйста, прочитайте │
File <файл: Documentation / admin-guide / parport.rst> и │ │ <файл: drivers / parport / BUGS-parport>.
Нажмите ENTER или введите команду для продолжения
Чтобы удалить эти палки, нужна замена:
s/│//g

Ну и хотелось бы вообще избавить текст от переносов строк:
 tr '\n', ' '
окно и так небольшое, там без символа \n все гораздо компактнее, переносы делаются автоматом по размеру окна, да и нам, собственно нужен только сам перевод без всякого форматирования. Эта же команда уберет пустые строки.

Предлагаю такой вариант, если опять нигде не ошибся, вроде работает:
TextIn="$(xsel -o | sed -re 's/│//g;s/^\s+//; s/\s+$//; s/(\S+)\s{2,}(\S+)/\1 \2/' | tr '\n', ' ')"

Вот тот же текст, переведенный после этого фильтра:
Если вы хотите использовать устройства, подключенные к параллельному порту вашей машины (разъем на компьютере с 25 отверстиями), например, ZIP-принтер для принтера PLIP link (Интернет-протокол параллельной линии в основном используется для создания мини-сети путем подключения параллельных портов двух локальных компьютеров) и т. д., здесь необходимо сказать Y; пожалуйста, прочитайте <файл: Documentation / admin-guide / parport.rst> и <файл: drivers / parport / BUGS-parport>.
Как видим, текст не только получился компактнее, но и несколько изменился по смыслу.
anode
Вот такой набор палочек и букв s должен убирать все пробельніе символы в начале и конце строки, заменять все пробельные символы между словами на один пробел, удалять пустые строки, если ни где не ошибся.
[anode@TM-8481 ~]$ sed -re 's/^\s+//; s/\s+$//; s/(\S+)\s{2,}(\S+)/\1 \2/; /^$/d'
ошибся все таки...
sed -e '
# Удаляем пустые строки с пробелами или без.
/^ *$/d;
# Заменяем все последовательности из одного и более пробелов на один пробел.
s/ \+/ /g;
# Заменяем любую последовательность пробелов на ничто с начала строки.
s/^ *//;
# Заменяем любую последовательность пробелов на ничто до конца строки.
s/ *$//;
' tagsed
тестовые данные

 t                                   lab
:lab
             s/aa/Z/
        T                isf

 a      aaa sfsg  dfsg       не  пройдет
  :isf sfg  fggg dfa        и это          и это  тоже
 b                            lab
а      так       пройдет?
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Почему бы и нет? Выкинуть лишние болтики и пройдет
[anode@TM-8481 ~]$ cat naf.txt

 t                                   lab
:lab
             s/aa/Z/
        T                isf

 a      aaa sfsg  dfsg       не  пройдет
  :isf sfg  fggg dfa        и это          и это  тоже
 b                            lab
а      так       пройдет?
[anode@TM-8481 ~]$ sed -re 's/^\s+//; s/\s+$//; s/\s{2,}/ /g; /^$/d' naf.txt
t lab
:lab
s/aa/Z/
T isf
a aaa sfsg dfsg не пройдет
:isf sfg fggg dfa и это и это тоже
b lab
а так пройдет?
Первая команда удаляет лидирующие пробельные символы, а последняя удаляет пустую строку, поэтому особого смысла в /^\s+$/d нет.
Ваша конструкция s/ \+/ /g; не справляется
[anode@TM-8481 ~]$ echo -e "Z\t  \t \tZ" | sed -re 's/ +/ /g;'
Z                       Z
Даже если убрать ненужный и вредный при запуске с ключом -r \ перед + - всё равно не работает, because + в BRE не есть метасимвол, а в ERE вы его заэкранировали :) А конструкция s/\s{2,}/ / запросто заменяет последовательно идущие один пробел и табуляцию на пробел, патамушо оперирует классом символов. За g спасибо, забыл
[anode@TM-8481 ~]$ echo -e "Z\t  \t \tZ" | sed -re 's/\s{2,}/ /g;'
Z Z
Так что \s\S рулят :)
Про употребление звездочек, приводящих при удалении к нужному результату, я уже писал, нет смісла повторять.
PS. + таки работает в BRE если его забэкслешить. Абшибочка вышла.
anode
Ваша конструкция s/ \+/ /g; не справляется
ну да и не должна была обрабатывать еще и табы...
а что имелось ввиду четко прописано в комментарии...
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Я использую такой фильтр
TextIn="$(xsel -o | sed 's/^ *//g;s/ *$//' | tr -dc '[:print:]')"
... меня устраивает, все мои примеры работают ...

EDIT 1 - tr -dc '[:print:]' - удаляет все непечатаемые символы.
Пример непечатаемых символов из man - M-bM-^@M-^P и $ ... PS - ошибся, не там смотрел, это ASCII символы
а вот так выглядит перевод из man
Утилита awk выполняет программы, написанные на языке программирования awk, который специализируется на манипулировании текстовыми данными. Программа awk - это последовательность шаблонов и соответствующих действий. Когда считывается ввод, соответствующий шаблону, выполняется действие, связанное с этим шаблоном.

EDIT 2 - можно и еще проще - удаляем все ведущие пробелы любого типа и все непечатаемые символы
TextIn="$(xsel -o | sed 's/^[[:space:]]*//g' | tr -dc '[:print:]')"

EDIT 3 - а вообще то фильтр должен подбирать каждый сам для себя ... а кому то он и вообще не нужен ... все индивидуально.

Вопрос к red - написали много лишнего, может есть смысл подчистить?, чтобы на захламлять продукт - решать тебе
Ошибки не исчезают с опытом - они просто умнеют
vasek
а вообще то фильтр должен подбирать каждый сам для себя
Наверное, имеет смысл вынести его куда-нибудь вверх, в сеттинг переменных. И действительно мнение автора неплохо бы услышать.
vasek
Вопрос к red - написали много лишнего, может есть смысл подчистить?
да не, всё нормально, пусть будет
vasek
а вообще то фильтр должен подбирать каждый сам для себя
heider
Наверное, имеет смысл вынести его куда-нибудь вверх, в сеттинг переменных.
идея с фильтром очень интересная, пока пробую разные варианты
хотелось бы иметь возможность легко применять больше чем одного фильтра за раз, через ключи это будет не очень удобно, возможно через специальный файл фильтров будет проще подключать нужные фильтры а ненужные комментировать
Крутил я с переводм man, пробуя разные фильтры … и ничего мне не нравится … Чтобы было понятно, опишу подробнее
Возьмем кусок man
DESCRIPTION$
       The  awk  utility  shall execute programs written in the awk programming language, which is specialized
       for textual data manipulation. An awk program is a sequence of patterns and corresponding actions. When
       input is read that matches a pattern, the action associated with that pattern is carried out.
Если его перевести без фильтра, то получим
ОПИСАНИЕ
       Утилита awk выполняет программы, написанные на языке программирования awk, который
является специализированным.
       для обработки текстовых данных. Программа awk - это последовательность шаблонов и
соответствующих действий. когда
       считывается ввод, соответствующий шаблону, выполняется действие, связанное с этим
шаблоном.
Если его перевести с фильтром (с разными, приведенными в топике), то получим
ОПИСАНИЕ Утилита awk выполняет программы, написанные на языке программирования awk, который специализируется на манипулировании текстовыми данными. Программа awk - это последовательность шаблонов и соответствующих действий. Когда считывается ввод, соответствующий шаблону, выполняется действие, связанное с этим шаблоном.
Ни тот ни другой вариант вообщем то не смотрятся. Перепробовал кучу фильтров, представляющих однострочные конструкции, но ничего не получилось (пробовал даже на уровне байтов…)
В ручную на уровне байтов все получается замечательно, как пример, если удалить следующие две последовательность байтов (выделена жирным)
1.
00000067 68 69 63 68 20 69 73 20 73 70 65 63 69 61 6c 69 |hich is speciali|
00000077 7a 65 64 0a 20 20 20 20 20 20 20 66 6f 72 20 74 |zed. for t|
2.
000000e0 6f 6e 73 2e 20 57 68 65 6e 0a 20 20 20 20 20 20 |ons. When. |
000000f0 20 69 6e 70 75 74 20 69 73 20 72 65 61 64 20 74 | input is read t|
то получим следующий текст
DESCRIPTION
       The  awk  utility  shall execute programs written in the awk programming language, which is specialized for textual data manipulation. An awk program is a sequence of patterns and corresponding actions. When input is read that matches a pattern, the action associated with that pattern is carried out.
а вот так будет выглядеть его перевод без всяких фильтров
ОПИСАНИЕ
       Утилита awk выполняет программы, написанные на языке программирования awk, который специализируется на манипулировании текстовыми данными. Программа awk - это последовательность шаблонов и соответствующих действий. Когда считывается ввод, соответствующий шаблону, выполняется действие, связанное с этим шаблоном.
И задача сводится к двум щагам
1 шаг - все пробелы, если их больше 2-х, заменяем на 1 - это делается просто, используя sed
sed 's/ */ /g' …. или sed 's/\x20 */ /g'
В результате так будут выглядеть эти две последовательности, приведенные выше
00000060 63 68 20 69 73 20 73 70 65 63 69 61 6c 69 7a 65 |ch is specialize|
00000070 64 0a 20 66 6f 72 20 74 65 78 74 75 61 6c 20 64 |d. for textual d|
………….
000000d0 69 6f 6e 73 2e 20 57 68 65 6e 0a 20 69 6e 70 75 |ions. When. inpu|
000000e0 74 20 69 73 20 72 65 61 64 20 74 68 61 74 20 6d |t is read that m|
2 шаг - удалить символ LF (0a) ….. а вот это шаг у меня, используя sed, не получается … а писать скрипт … не хочется.
Вот на этом я и остановился. Нужно лезти в DOC …


PS - зачеркнул, имхо, так не пойдет, нужный байт 0a легче искать (а потом удялять) по присутствию рядом с ним кучи пробелов ...

EDIT 1 - используя sed могу удалить любой символ на уровне байтов, но только не управляющий символ LF (hex код которого есть 0a) ... и похоже его не удалить, значит нужен другой способ ... или может поможет awk ??? ... используя dd, конечно можно удалить этот байт oa, но усложнится запись ...
Ошибки не исчезают с опытом - они просто умнеют
anode
удалить символ LF (0a) ….. а вот это шаг у меня, используя sed, не получается
А так нельзя?
tr -d '\n'

Или я не совсем понял, что требуется... Нужно оставить перенос и отступ после DESCRIPTION, а остальные переносы удалить?
 
Зарегистрироваться или войдите чтобы оставить сообщение.