LINUX.ORG.RU

Вопрос по спецсимволам пробела


0

1

Парсю (паршу?) XML в текстовый файл, хочу на выходе убрать лишние пробелы, применяю конструкцию «tr -s [:blank:]». Копирую строчку из получившегося текстового файла, вставляю в терминал в качестве аргумента echo, пытаюсь применить конструкцию:

piyavking@piyavking-desktop:~/Downloads$ echo  '     На остальные ваши вопросы' | tr -s [:blank:]
     На остальные ваши вопросы

Ок, в терминале вбиваю ту же строчку, удаляю пробелы руками, потом руками же вбиваю пробелы на место, и имею:

piyavking@piyavking-desktop:~/Downloads$ echo  '     На остальные ваши вопросы' | tr -s [:blank:]
 На остальные ваши вопросы
piyavking@piyavking-desktop:~/Downloads$

Получается, что в этом файле я имею какие-то спецсимволы, выглядящие как пробел, но пробелами по факту не являющиеся.

Как мне их выцепить/посмотреть, чтобы иметь возможность отфильтровать?

ты получаешь ровно то, что хотел. Прочитай man tr :)

MKuznetsov ★★★★★ ()
$ echo '     На остальные ваши вопросы' | tclsh <(echo 'puts [string trim [read stdin]]')
На остальные ваши вопросы
$ echo '     На остальные ваши вопросы ' | sed 's/^\s*//;s/\s*$//'
На остальные ваши вопросы

Тебе наверное что-то вот такое надо?

Xenius ★★★★★ ()

Как мне их выцепить/посмотреть, чтобы иметь возможность отфильтровать?

piyavking@piyavking-desktop:~/Downloads$ echo  '     На остальные ваши вопросы' | hexdump
kulti ★★ ()
Ответ на: комментарий от kulti

Ээээ... Ну так-то понятно, куда ты клонишь, но. по-моему, уж больно глубоко.

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

Ну так-то да, но с поправочкой: чтобы все пустые подстроки превращались в одинарные пробелы, вне зависимости от того, в каком месте строки они есть, то есть

piyavking@piyavking-desktop:/$ echo '     На         остальные ваши вопросы ' | sed 's/^\s*//;s/\s*$//'
На         остальные ваши вопросы

Не годится. Это раз. Второе - при копировании выхлопа терминала в форум эти неведомые символы превращаются в пробелы, так что, подставляя строку из своего файла, всё равно имею

piyavking@piyavking-desktop:~/Downloads$ echo '     На остальные ваши вопросы' | sed 's/^\s*//;s/\s*$//'
     На остальные ваши вопросы
piyavking ★★★ ()
Ответ на: комментарий от kulti

С пробелами в начале:

piyavking@piyavking-desktop:~/Downloads$ echo '     На остальные ваши вопросы' | hexdump
0000000 2020 2020 d020 d09d 20b0 bed0 81d1 82d1
0000010 b0d0 bbd0 8cd1 bdd0 8bd1 b5d0 d020 d0b2
0000020 d1b0 d088 20b8 b2d0 bed0 bfd0 80d1 bed0
0000030 81d1 8bd1 000a                         
0000035

Со строкой из файла:

piyavking@piyavking-desktop:~/Downloads$ echo '     На остальные ваши вопросы' | hexdump
0000000 a0c2 a0c2 a0c2 a0c2 d020 d09d 20b0 bed0
0000010 81d1 82d1 b0d0 bbd0 8cd1 bdd0 8bd1 b5d0
0000020 d020 d0b2 d1b0 d088 20b8 b2d0 bed0 bfd0
0000030 80d1 bed0 81d1 8bd1 000a               
0000039

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

Не годится. Это раз. Второе - при копировании выхлопа терминала в форум эти неведомые символы превращаются в пробелы

Давай echo 'строка' | base64 тогда

чтобы все пустые подстроки превращались в одинарные пробелы, вне зависимости от того, в каком месте строки они ест

$ echo '     На         остальные ваши вопросы ' | sed 's/^\s*//;s/\s*$//;s/\s\+/ /g'
На остальные ваши вопросы

Я так понимаю, в начале и конце строки их вообще надо удалять?

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

чтобы все пустые подстроки превращались в одинарные пробелы, вне зависимости от того, в каком месте строки они есть

'     На остальные ваши вопросы' | sed -r 's/\s+/ /'
TGZ ★★★★ ()
Ответ на: комментарий от kulti

«И что? Я вижу, что в файле неразрывный пробел (NO-BREAK SPACE), а ты? =)»

Я так глубоко пока не плаваю )

И так что мне с этим неразрывным пробелом делать?

piyavking ★★★ ()
Ответ на: комментарий от Xenius
piyavking@piyavking-desktop:~/Downloads$ echo '     На остальные ваши вопросы' | base64
wqDCoMKgwqAg0J3QsCDQvtGB0YLQsNC70YzQvdGL0LUg0LLQsNGI0Lgg0LLQvtC/0YDQvtGB0YsK

Не, в начале и в конце строки удалять не надо, просто заменить несколько пробелов на один. С помощью юзера kulti докопались, что имеют место неразрывные пробелы. Осталось понять, как преобразовать их в обычные пробелы, и выдохнуть.

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

Ясно. Для замены на обычный пробел:

echo '     На остальные ваши вопросы' sed 's/\xc2\xa0/ /'

Либо модифицируй sed для удаления только тех, что в начале, или что там тебе надо.

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

С помощью юзера kulti докопались, что имеют место неразрывные пробелы. Осталось понять, как преобразовать их в обычные пробелы, и выдохнуть.

Можно просто использовать что-нибудь с хорошей поддержкой юникода. По идее [[:space:]] или \s должен их матчить и без дополнительного шаманства

echo \"`base64 -d <<< wqDCoMKgwqAg0J3QsCDQvtGB0YLQsNC70YzQvdGL0LUg0LLQsNGI0Lgg0LLQvtC/0YDQvtGB0YsK | tclsh <(echo 'puts [regsub -all {[[:space:]]+} [read stdin] { }]')`\"
" На остальные ваши вопросы "
Xenius ★★★★★ ()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от kulti
piyavking@piyavking-desktop:~/Downloads$ echo '     На остальные ваши вопросы' | hexdump
0000000 a0c2 a0c2 a0c2 a0c2 d020 d09d 20b0 bed0
0000010 81d1 82d1 b0d0 bbd0 8cd1 bdd0 8bd1 b5d0
0000020 d020 d0b2 d1b0 d088 20b8 b2d0 bed0 bfd0
0000030 80d1 bed0 81d1 8bd1 000a               
0000039
piyavking@piyavking-desktop:~/Downloads$ echo '     На остальные ваши вопросы' | sed 's/\xc2\xa0/'*'/'
*    На остальные ваши вопросы
piyavking@piyavking-desktop:~/Downloads$
piyavking ★★★ ()
Ответ на: комментарий от piyavking

Ну, йопта, чувак. Мозгами пораскинь. Заменился только один символ, а нужно все. Вбивай в гугол «sed replace all characters» и сразу же найдешь ответ.

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

А с 'enter'ом в подобной ситуации не подскажешь, как поступить?

В первом случае - в начале файла нечто, выглядящее как «Enter»:

piyavking@piyavking-desktop:~$ cat ~/tmp/conkyrss_cut | hexdump
0000000 0a0d 0a0d a1d0 d020 d1b4 d080 d0b5 d0b2
0000010 d0bd d0b5 d1b3 d080 d1b5 d087 d1b5 d081
0000020 d0ba d0be d0b3 20be 8fd1 b7d0 8bd1 bad0
0000030 b0d0 d120 d081 d0bb d0be d0b2 20be d022
0000040 d0b3 d0b8 d0bf d0bd d0be 22b7 d020 d0bf
0000050 d1b5 d080 d0b5 d0b2 d0be d0b4 d1b8 d182
0000060 d181 208f bad0 b0d0 bad0 2220 81d1 bed0
0000070 bdd0 2e22 0020                         
0000075

Во втором случае - честно вбитый руками «Enter»:

piyavking@piyavking-desktop:~$ cat ~/tmp/conkyrss_cut | hexdump
0000000 0a0a a1d0 d020 d1b4 d080 d0b5 d0b2 d0bd
0000010 d0b5 d1b3 d080 d1b5 d087 d1b5 d081 d0ba
0000020 d0be d0b3 20be 8fd1 b7d0 8bd1 bad0 b0d0
0000030 d120 d081 d0bb d0be d0b2 20be d022 d0b3
0000040 d0b8 d0bf d0bd d0be 22b7 d020 d0bf d1b5
0000050 d080 d0b5 d0b2 d0be d0b4 d1b8 d182 d181
0000060 208f bad0 b0d0 bad0 2220 81d1 bed0 bdd0
0000070 2e22 0020                              
0000073
piyavking@piyavking-desktop:~$

piyavking ★★★ ()

Кривой tr из GNU Coreutils не может в UTF-8. Возможно, в каком-нибудь красношапочном дистрибутиве сработает как надо.

Gotf ★★★ ()

Это \n(0a) и \r(0d). Такого символа, как 'enter' не существует. В юниксах, когда пользователь нажимает enter, принято \n ставить, а в виндах - \r\n. Если они тебя только в начале файла беспокоят, то можно тем же sed'ом отрезать первую строчку файла

sed -e 'd'
Или с помощью tail:
tail -n +2

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

Нет, к сожалению, не в начале. Это я cp1251-поток пытаюсь корректно спарсить. «iconv -f cp1251 -t utf-8» не помогает(, всё равно на выходе кракозябры, вызванные вот этой фишкой.

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

кракозябр простой - в коньках прямоугольник, в leafpad и libreoffice - пустая строка. «tr -d '\r'» вставил в парсер, прогнал парсер на cp1251-потоке - вроде всё норм.

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