LINUX.ORG.RU

sed и два пробела

 


0

0

Есть код sed 's/\s[^$]/\\&/g'<<<"$VAR" — заменяет пробелы кроме пробела в конце строки на экранированные.
Проблема в том, что если где-то идёт 2 пробела, он один не экранирует. Как сделать, чтоб экранировал все?
И я даже не понимаю, почему он так делает.
Если без [^$] — то нормально. Но [^$] нужно.

★★★★★

Последнее исправление: teod0r (всего исправлений: 3)

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

Лучше объясни мне это:

~ $ echo -en '$$$$\n'>/tmp/tmp0002.tmp;sed 's/[^$]/Z/g' /tmp/tmp0002.tmp
$$$$                                                                                                                                                                                                               
                                                                                                                                                                                                                   
~ $
~ $ echo -en '$$$$\r\n'>/tmp/tmp0002.tmp;sed 's/[^$]/Z/g' /tmp/tmp0002.tmp                                                                                                                                          
$$$$Z                                                                                                                                                                                                              
                                                                                                                                                                                                                   
~ $ 

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

см. выше. Мы возвращаемся к тому, что 0x0A — это LF.

какая разница, что такое LF?

может у вас огрызко-проблемы, или шелло-проблемы, мне пофиг, у меня Linux и bash.

\n == EOL == LF == 0x0A

\r == CR == 0xOD

колись, что у тебя.

emulek
()
Ответ на: комментарий от emulek
~ $ echo -en '$$$$\r\n'|hexdump
0000000 2424 2424 0a0d                         
0000006
~ $ echo -en '$$$$\n'|hexdump
0000000 2424 2424 000a                         
0000005
~ $ 

0x0d матчится sed'ом как EOL, а 0x0a — нет? Какие-то шеллопроблемы. Припоминаю читал книжку, там написание шелла как раз рассматривалось, в том числе обработка спецсимволов и escape-последовательностей.

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

0x0d матчится sed'ом как EOL, а 0x0a — нет?

в Linux строчки принято заканчивать 0x0a (\n), а 0x0d (\r) — просто символ, невидимый, и на моём терминале работает как CR

$ echo -e 'ABCDEF\rXYZ'
XYZDEF

emulek
()
Ответ на: комментарий от wakuwaku
$ echo -en '$$$$\r'>/tmp/tmp0002.tmp;sed 's/[^$]/Z/g' /tmp/tmp0002.tmp
$$$$Z

всё верно: \r это не доллар, и он матчится. И тут нет CR в выводе. На входе его тоже нет.

$ echo -e '$$$$\r'|sed 's/[^$]/Z/g'
$$$$Z
тоже самое, но красивее.

$ echo -e '$$$$\r\n\r'|sed 's/[^$]/Z/g'
$$$$Z
Z

как видишь, LF тут вообще в обработке не участвует, а напрямую едет на вывод.

$ echo -e '\n\n\r\n'|sed 's/[^$]/Z/g'


Z

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

Твоя правда, наверное. Я под веществами. И эмм, мне было скучно, извини. :>

Так что, с \r это мои глюки, но \n sed всё же воспринимает как конец строки:

~ $  echo -en '$$$$\n\n\r\r11\n'|sed 's/$/Z/g'
$$$$Z
Z
11Z
~ $ 

Теперь можно обсудить то, что я сказал изначально, а именно \n преобразуется во вполне определённые байты, т.е. является спецсимволом (пусть и невидимым, но он там есть) LF, который нужно учитывать при разборе строк.

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

Я под веществами.

\n sed всё же воспринимает как конец строки

как ещё оно может воспринимать конец строки?

\n преобразуется во вполне определённые байты, т.е. является спецсимволом (пусть и невидимым, но он там есть) LF, который нужно учитывать при разборе строк.

в sed скрипте нельзя. Нет там такого символа. Я его юзаю как раз тогда, когда мне нужен какой-то маркёр, которого ТОЧНО не будет.

например:

$ echo "ABCDEFGH"|\
sed -r 's/^/\n/;s/$/\n/;bl;:l;s/(.*)(\n.)(.*)(.\n)(.*)/\1\4\3\2\5/;tl;s/\n//g'
HGFEDCBA
разворот строки наоборот, попробуй «улыбоктебедедмакар» например.

emulek
()
Ответ на: комментарий от wakuwaku

ну теперь изучай мой скрипт. Как изучишь — приходи ☺

emulek
()
18 февраля 2016 г.

удалите долбайобау

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