- Перевод строки
- Терминология
- Способы представления
- Конвертирование
- Управляющие символы Linux
- Управляющие символы ^J и ^М
- Управляющие символы ^С и ^\
- Управляющий символ ^D
- Управляющий символ ^V
- Утилита stty
- Настройки драйвера терминала
- Управляющие символы SO (^N) и SI (^O)
- How can I have a newline in a string in sh?
- 13 Answers 13
Перевод строки
Перевод строки, или разрыв строки — продолжение печати текста с новой строки, то есть с левого края на строку ниже, или уже на следующей странице.
Терминология
Возврат каретки (англ. carriage return, CR) — управляющий символ ASCII (0x0D, 1310, ‘\r’), при выводе которого курсор перемещается к левому краю поля, не переходя на другую строку. Этот управляющий символ вводится клавишей «Enter». Будучи записан в файле, в отдельности рассматривается как перевод строки только в системах Macintosh.
Подача строки (от англ. line feed, LF — «подача [бумаги] на строку») — управляющий символ ASCII (0x0A, 10 в десятичной системе счисления, ‘\n’), при выводе которого курсор перемещается на следующую строку. В случае принтера это означает сдвиг бумаги вверх, в случае дисплея — сдвиг курсора вниз, если ещё осталось место, и прокрутку текста вверх, если курсор находился на нижней строке. Возвращается ли при этом курсор к левому краю или нет, зависит от реализации.
Способы представления
Способ представления перевода строки в текстовом файле часто зависит от используемой операционной системы:
LF ( ASCII 0x0A) используется в Multics, UNIX, UNIX-подобных операционных системах (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD и др.), BeOS, Amiga UNIX, RISC OS и других;
CR ( ASCII 0x0D) используется в 8-битовых машинах Commodore, машинах TRS-80, Apple II, системах Mac OS до версии 9 и OS -9;
CR+LF ( ASCII 0x0D 0x0A) используется в DEC RT-11 и большинстве других ранних не-UNIX- и не-IBM-систем, а также в CP/M, MP/M (англ.), MS -DOS, OS /2, Microsoft Windows, Symbian OS , протоколах Интернет.
Конвертирование
Способы конвертирования файла:
Файл → Сохранить как… → Конец строки → …
tr -d '\r' dos.file >unix.file tr -d '\015' dos.file >unix.file sed --in-place 's/$/\r/' unix2dos.file sed --in-place 's/\x0d$//' dos2unix.file
Управляющие символы Linux
При вводе с терминала управляющие символы (таблица ниже) служат командами драйверу терминала и в большинстве своем, генерируются при помощи сочетания клавиш Ctrl (отсюда ее название control — управление) с одной из алфавитно-цифровых клавиш. В отдельных случаях, управляющие символы генерируются специально предназначенными для этого клавишами, например, ↵ Enter, Tab или ← Backspace
Нотация | Ввод символа | Вывод символа | Клавиши | Код символа | Код символа |
^C | intr | — | Ctrl+C | 0x03 | ЕТХ |
^\ | quit | — | Ctrl+\ или Ctrl+4 | 0x1С | FS |
^Z | susp | — | Ctrl+Z | 0х1А | SUB |
^D | eof | — | Ctrl+D | 0x04 | EOT |
^? | erase | — | ← Backspace или Ctrl+? или Ctrl+8 | 0x7F | DEL |
^H или \b | — | backspace | Ctrl+H | 0x08 | BS |
^W | werase | — | Ctrl+W | 0x17 | ETB |
^U | kill | — | Ctrl+U | 0x15 | NAK |
^| или \t | — | tab | Tab или Ctrl+I | 0x09 | HT |
^M или \r | eol | cr | ↵ Enter или Ctrl+М | 0x0D | CR |
^J или \n | eol | nl | Ctrl+J | 0x0A | LF |
^S | stop | — | Ctrl+S | 0x13 | DC3 |
^Q | start | — | Ctrl+Q | 0x11 | DC1 |
^R | rprnt | — | Ctrl+R | 0x12 | DC2 |
^V | lnext | — | Ctrl+V | 0x16 | SYN |
^N | — | so | Ctrl+N | 0x0E | SO |
^O | — | si | Ctrl+O | 0x0F | SI |
^[ или \e | esc | esc | Esc или Ctrl+[ или Ctrl+3 | 0x1B | ESC |
Так, например, нажатие клавиши ↵ Enter или эквивалентное сочетание Ctrl+J, записывающееся как ^J, генерирует управляющий символ LF (таким же действием обладает символ CR, ^M), который сигнализирует драйверу терминала о завершении ввода строки (eol, end of line) и необходимости «отдать команду на выполнение».
Управляющие символы ^J и ^М
Вс. февр. 1 22:39:00 MSK 2015
[email protected]:~$ whoami ^J
Нажатие клавиши ← Backspace или сочетания клавиш Ctrl+? приводит к генерации управляющего символа DEL, что заставляет драйвер выполнить управляющее действие erase (^?) — удалить последний набранный символ. Аналогично, warese (^W) и kill (^U) удаляют последнее набранное слово и всю набранную строку соответственно.
Управляющие символы intr (^U) и quit (^\) — соответственно штатно и аварийно завершают запущенную ранее и выполняющуюся сейчас программу, а символ susp (^Z) временно приостанавливает выполняющуюся программу, что проиллюстрировано в следующем листинге.
Управляющие символы ^С и ^\
[email protected]:~$ dd if=/dev/dvd of=dvd.iso
^C6227352+0 записей получено
6227351+0 записей отправлено
скопировано 3188403712 байт (3,2 GВ), 2,72618 с, 1,2 GB/c
[email protected]:~$ dd if=/dev/cdrom of=cd.iso
^\выход (сделан дамп памяти)
Символы stop (^S) и start (^Q) управляют потоком вывода (и, как следствие, скроллингом терминала), что можно использовать для временной приостановки вывода команд с многострочным выводом. Однако случайное нажатие ^S может привести начинающего пользователя в замешательство— будет казаться, что терминал «завис», т. е. отсутствует реакция со стороны операционной системы на какие-либо нажимаемые клавиши и посылаемые символы, тогда как на самом деле отсутствует (приостановлен) лишь ее вывод— до нажатия ^Q, ^C или ^\.
Управляющий символ eof (^D) используется для оповещения драйвера о завершении ввода, при работе с интерактивными (ведущими с пользователем двусторонний попеременный диалог) программами.
Управляющий символ ^D
Subject: Не забыть про Ctrl+D ↵
Символ ^D полезен для mail, at… где еще? ↵
warning: commands will be executed using /bin/sh
at> mplayer ~/sounds/alarm.mp3 ↵
at> notify-send -i info ‘Хватит работать’ ↵
job 4 at Sat Jan 31 21:30:00 2015
[email protected]:~$ lftp ftp.ubuntu.com
lftp ftp.ubuntu.com:~> get /ubuntu/pool/main/n/manpages/manpages_3.74.orig.tar.xz ↵
291196 байтов перемещено за 7 секунд (22б.2Кб/с)
lftp ftp.ubuntu.com:/>^D exit
Нужно заметить, что при работе с диалоговыми программами ^C или ^\ завершит выполняющуюся программу (at), не дав ей выполнить свое основное действие, или вообще будет проигнорирован (ftp, mail). Именно символ завершения ввода (eof, end of file) сообщит драйверу о нежелании больше вести диалог с программой (которой в свою очередь сообщит программе об отсутствии для нее вводимых данных).
В очень «редких случаях, возможно, потребуется ввести сам управляющий символ, например ^С, ^\ или ^D, непосредственно в выполняющуюся на терминале программу, что цевйзможно «сделать соответствующими клавиатурными комбинациями, потому как управляющие символы будут поглощены драйвером терминала, что приведет к завершению программы, в которую вводятся символы. Для отмены (экранирования) специального назначения управляющих символов в пользу его непосредственного (литерального) значения служит управляющий символ (literal next) lnext (^V), сигнализирующий драйверу терминала об отмене специального назначения следующего за ним символа.
Управляющий символ ^V
Ctrl+C: ^V^C ↵
0000000 C t r l + C : 003 \n
00000000 43 74 72 6c 2b 43 3a 03 0a |Ctrl+C: |
Реакция драйвера терминала на получаемые управляющие символы и предпринимаемые им управляющие действия (а точнее, наоборот— управляющие символы, закрепленные за управляющими действиями) стандартно предопределена, но почти все эти соответствия могут быть просмотрены и изменены командой stty.
Утилита stty
speed 38400 baud; rows 38; columns 136; line = 0;
intr = ^C; quit = ^\; erase = ^?; » kill = ^U; eof = ^D; eol = ; eol2 = ;
swtch = ; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^0; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Кроме того, команда stty позволяет получить (а также задать) и другие настройки драйвера терминала:
♦ скорость приемопередатчика последовательного интерфейса терминала
(speed 38400 baud);
♦ количество изображаемых терминалом строк и столбцов (rows 33; columns 119);
♦ флаги режимов работы приемопередатчика интерфейса (-parenb.. .hupcl -cstopb…-inpck);
♦ флаги режимов обработки вводимых из терминала символов (-istrip…-igncr icrnl…iutf8);
♦ флаги режимов обработки выводимых на терминал символов (opost…-ofdel) и пр.
Так, например, флаг icanon включает или выключает (-icanon) «канонический» (Canonical) режим обработки вводимых (input) символов, т. е. возможности редактирования вводимой строки при помощи управляющих символов ^? и ^U, а также сигнализацию завершения ввода при помощи ^D.
Флаг iexten включает «расширения» канонического режима стандарта POSIX, т. е. удаление последнего введенного слова при помощи ^W, перерисовку введенной строки при помощи ^R и ввод литеральных значений управляющих символов при помощи ^V.
Управляющие символы ^С, ^\ и ^Z штатного или аварийного завершения и приостановки выполняющейся программы активируются флагом isig, разрешающим или запрещающим (-isig) посылку сигналов (signal).
Флаг icrnl включает трансляцию вводимого символа CR в символ LF, что позволяет запускать команды клавишей ↵ Enter (неожиданно, правда?), потому как основной символ для этого действия авсе же— LF (так уж сложилось в UNIX со времен телетайпа ASR-33).
К счастью, большинство из этих параметров и флагов применимы только при работе с настоящими аппаратными терминалами и интерфейсами. Поэтому пояснение их назначения можно опустить хотя бы просто пртому, что оно требует дополнительных знаний специфики соответствующей аппаратуры, что не имеет ни особой актуальности.
Нужно также отметить, что некоторые диалоговые программы «игнорируют» некоторые настройки терминала, например флаг «канонического» режима. Точнее, они всегда работают в «неканоническом» режиме и сами обрабатывают управляющие символы, зачастую переопределяя некоторые из них или добавляя обработку дополнительных, например, для командного интерпретатора bash(1) это ^R (reverse-search-history), ^S (forward-search-history), ^D (delete-char) ^L (clear-screen), ^A (beginning-of-line), ^E (end-of-line), ^F(forward-char) , ^B (backward-char), ^P (previous-history), ^N (next-history) и др.
Настройки драйвера терминала
[email protected]:~$ dd if=/dev/dvd of=dvd.iso
При выводе информации ид терминал, управляющие символы (в отличие от алфавитно-цифровых символов, подлежащих изображению каким-либо значком) служат для управления терминалом (ascii, console_codes). Например, символ CR (carriage return) перемещает печатающую головку или курсор терминала в начало строки, символ LF (line feed)— в начало новой строки, символ NL (nl, new fine) — на следующую строку, символ HT (horizontal tab)— на несколько символов вправо, а символ BS (back space) стирает один символ слева от курсора (или просто перемещает печатающую головку на один символ влево) и т. д.
Так, символ LF, используемый в «текстовых» файлах при выводе их на экран, позволяет разделять «логические» строки файла и изображать их на разных «физических» строках терминала, а символы SO (shift out) и SI (shift in) соответственно включают , и выключает альтернативный шрифт тефмйнала, содержащий другие знаки вместо маленьких букв латинского алфавита. Именно поэтому при ошибочном выводе на терминал «бинарного» файла, в содержимом которого весьма вероятно встретить символ SO, активирующий альтернативный шрифт, возникает ощущение «испорченности» терминала, которую легко починить выводом символа SI, возвращающего терминал к стандартному шрифту. Для этого достаточно литерально ввести символ SI, который будет расценен командным интерпретатором как (несуществующая) команда и выведен на экран в сообщении об ошибке.
Управляющие символы SO (^N) и SI (^O)
hahaha^\^N+hahaha^V^O
How can I have a newline in a string in sh?
What should I do to have a newline in a string? Note: This question is not about echo. I’m aware of echo -e , but I’m looking for a solution that allows passing a string (which includes a newline) as an argument to other commands that do not have a similar option to interpret \n ‘s as newlines.
13 Answers 13
If you’re using Bash, you can use backslash-escapes inside of a specially-quoted $’string’ . For example, adding \n :
STR=$'Hello\nWorld' echo "$STR" # quotes are required here!
If you’re using pretty much any other shell, just insert the newline as-is in the string:
Bash recognizes a number of other backslash escape sequences in the $» string. Here is an excerpt from the Bash manual page:
Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows: \a alert (bell) \b backspace \e \E an escape character \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab \\ backslash \' single quote \" double quote \nnn the eight-bit character whose value is the octal value nnn (one to three digits) \xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) \cx a control-x character The expanded result is single-quoted, as if the dollar sign had not been present. A double-quoted string preceded by a dollar sign ($"string") will cause the string to be translated according to the current locale. If the current locale is C or POSIX, the dollar sign is ignored. If the string is translated and replaced, the replacement is double-quoted.