Intereting Posts
AIX ftpd – как установить umask для данного пользователя? Как привязать камеры USB v4l2 к тем же именам устройств даже после перезагрузки? Не удается отправить почту через sendmail Копирование адреса активного каталога в VIFM Могу ли я установить Arch-Linux на свой раздел жесткого диска, используя archlinux iso в VirtualBox? Как найти информацию о пакете Debian, удаленном из репозитория Debian? Обеспечивает ли SELinux достаточную дополнительную безопасность, чтобы быть в курсе обучения / настройки? ОШИБКА в стиле модерн на MacBook Pro с загрузкой Debian Как сделать фона терминала ярче белого? systemd PrivateTmp / JoinsNamespaceOf AWK выдает ошибку «неожиданная новая строка или конец строки» Разница между `.sh` и` .csh` Какое распределение обычно выбирается в корпоративной среде – Debian или RHEL (CentOS)? Разница в использовании () и $ () для выполнения ряда команд загрузка жесткого диска nfs занимает очень много времени

bash – почему \ x0d \ x20 стирает строку

Это вид редактора gedit: введите описание изображения здесь

и вид из редактора vim: введите описание изображения здесь

Затем я пытаюсь выполнить grep, он успешно выполнил grep, если я поставил Log вместо Tog, но результат поврежден:

[xiaobai@xiaobai grep]$ grep Tog test [xiaobai@xiaobai grep]$ grep Log test Dtring.valueOf [xiaobai@xiaobai grep]$ 

И затем я кот файл, он также поврежден:

 [xiaobai@xiaobai grep]$ cat test Dtring.valueOf [xiaobai@xiaobai grep]$ 

Поэтому я использую hexdump:

 [xiaobai@xiaobai grep]$ hexdump -C test 00000000 4c 6f 67 2e 64 28 22 6d 75 73 69 63 22 2c 20 22 |Log.d("music", "| 00000010 4e 41 56 49 47 41 54 4f 52 3a 20 22 20 2b 20 53 |NAVIGATOR: " + S| 00000020 74 72 69 6e 67 2e 76 61 6c 75 65 4f 66 0d 20 20 |tring.valueOf. | 00000030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | | 00000040 20 20 20 20 20 20 20 20 20 20 20 20 20 44 0d 0a | D..| 00000050 [xiaobai@xiaobai grep]$ 

Я сужу его:

 [xiaobai@xiaobai grep]$ cat test3 D [xiaobai@xiaobai grep]$ hexdump -C test3 00000000 61 0d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |a. | 00000010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | | 00000020 20 44 0d 0a | D..| 00000024 [xiaobai@xiaobai grep]$ echo -e '\x61' a [xiaobai@xiaobai grep]$ echo -e '\x61\x0d' a [xiaobai@xiaobai grep]$ echo -e '\x61\x0d\x20' [xiaobai@xiaobai grep]$ echo -e '\x61\x0d\x20\x62' b 

Как вы можете видеть, «a» стерто после добавления одного x x байта.

Поэтому мой вопрос: почему это происходит и как я могу избавиться от этого без предварительного знания некоторых файлов, может содержать \ x0d \ x20, например grep -r?

Символами кода от 0 до 31 в ASCII являются управляющие символы. Когда они отправляются на терминал, они привыкли делать особые вещи. Например, \a (BEL, 0x7) звонит в колокол терминала. \b (BS, 0x8) перемещает курсор назад. \n (LF, 0xa) перемещает курсор на одну строку вниз, \t (TAB 0x9) перемещает курсор в следующую таблицу …

\r (CR, 0xd) перемещает курсор в первый столбец.

Когда вы запускаете приглашение оболочки в терминале:

 printf 'foo\nbar\n' 

printf пишет foo\nbar\n в /dev/tty<something> , дисциплина tty line этого устройства переводит это в foo\r\nbar\r\n , поэтому вы видите bar на следующей строке после foo .

 printf 'foo\rbar\n' 

Будет ли терминал перезаписывать foo с помощью bar .

Если ваш файл содержит контрольные символы, вы можете либо удалить их, либо дать им текстовое представление (например, ^M или \r для символа CR 0xd), если вы хотите проверить их присутствие.

Возможно, вы не захотите делать это для символов LF и TAB. Так:

 LC_ALL=C tr -d '\0-\10\13-\37\177' < file # to remove them cat -v < file # to display as ^M sed -nl < file # to display as \r (also converts TAB to \t) # and marks the end of lines with $ 

Обратите внимание, что те sed и cat также будут преобразовывать символы, отличные от ASCII. Вы могли бы сделать вместо этого:

 LC_ALL=C sed "$(printf 's/[^\t -\176\200-\377]/^&/g')" < file | LC_ALL=C tr '\0-\10\13-\37\177' '@-HK-_?' 

Чтобы преобразовать только управляющие символы ASCII (кроме TAB и LF) в их визуальную форму ^X (обратите внимание, что не все реализации sed поддерживают входные файлы с NUL-символами в них).

\x0d – символ \r который приводит курсор к началу строки, тогда \x20 – это пробел, поэтому он перезаписывает a пробелом. Если вы используете систему unix-y, вам может потребоваться просто удалить \r из вашего вывода / файла, поскольку это не нужно, если это для вывода текста. \n "подразумевает" это для * nix, но не для Windows.