Linux как экранировать символ

Обновлено: 07.07.2024

Для того, чтобы полностью реализовать потенциал командной оболочки, вам придется овладеть Регулярными Выражениями. Многие команды и утилиты, обычно используемые в сценариях, такие как grep, expr, sed и awk, используют Регулярные Выражения.

Выражение -- это строка символов. Символы, которые имеют особое назначение, называются метасимволами . Так, например, кавычки могут выделять прямую речь, т.е. быть метасимволами для строки, заключенной в эти кавычки. Регулярные выражения -- это набор символов и/или метасимволов, которые наделены особыми свойствами. [1]

Основное назначение регулярных выражений -- это поиск текста по шаблону и работа со строками.

Звездочка -- * -- означает любое количество символов в строке, предшествующих "звездочке", в том числе и нулевое число символов .

Выражение "1133*" -- означает 11 + один или более символов "3" + любые другие символы: 113, 1133, 113312, и так далее.

Точка -- . -- означает не менее одного любого символа, за исключением символа перевода строки (\n). [2]

Выражение "13." будет означать 13 + по меньшей мере один любой символ (включая пробел): 1133, 11333, но не 13 (отсутствуют дополнительные символы).

Символ -- ^ -- означает начало строки, но иногда, в зависимости от контекста, означает отрицание в регулярных выражениях.

Знак доллара -- $ -- в конце регулярного выражения соответствует концу строки.

Выражение "^$" соответствует пустой строке.

Символы ^ и $ иногда еще называют якорями , поскольку они означают, или закрепляют, позицию в регулярных выражениях.

Квадратные скобки -- [. ] -- предназначены для задания подмножества символов. Квадратные скобки, внутри регулярного выражения, считаются одним символом, который может принимать значения, перечисленные внутри этих скобок..

Выражение "[xyz]" -- соответствует одному из символов x, y или z.

Выражение "[c-n]" соответствует одному из символов в диапазоне от c до n, включительно.

Выражение "[B-Pk-y]" соответствует одному из символов в диапазоне от B до P или в диапазоне от k до y, включительно.

Выражение "[a-z0-9]" соответствует одному из символов латиницы в нижнем регистре или цифре.

Выражение "[^b-d]" соответствует любому символу, кроме символов из диапазона от b до d, включительно. В данном случае, метасимвол ^ означает отрицание.

Объединяя квадратные скобки в одну последовательность, можно задать шаблон искомого слова. Так, выражение "[Yy][Ee][Ss]" соответствует словам yes, Yes, YES, yEs и так далее. Выражение "414-11-6863" определяет шаблон для поиска любого номера карточки социального страхования (для США).

Обратный слэш -- \ -- служит для экранирования специальных символов, это означает, что экранированные символы должны интерпретироваться буквально, т.е. как простые символы.

Комбинация "\$" указывает на то, что символ "$" трактуется как обычный символ, а не как признак конца строки в регулярных выражениях. Аналогично, комбинация "\\" соответствует простому символу "\" .

Экранированные "угловые скобки" -- \<. \> -- отмечают границы слова.

Угловые скобки должны экранироваться, иначе они будут интерпретироваться как простые символы.

Выражение "\<the\>" соответствует слову "the" , и не соответствует словам "them" , "there" , "other" и т.п.

Дополнительные метасимволы. Использующиеся при работе с egrep, awk и Perl

Знак вопроса -- ? -- означает, что предыдущий символ или регулярное выражение встречается 0 или 1 раз. В основном используется для поиска одиночных символов.

Знак "плюс" -- + -- указывает на то, что предыдущий символ или выражение встречается 1 или более раз. Играет ту же роль, что и символ "звездочка" ( * ), за исключением случая нулевого количества вхождений.

Экранированные "фигурные скобки" -- \ < \>-- задают число вхождений предыдущего выражения.

Экранирование фигурных скобок -- обязательное условие, иначе они будут интерпретироваться как простые символы. Такой порядок использования, технически, не является частью основного набора правил построения регулярных выражений.

Выражение "7\" -- в точности соответствует подстроке из пяти десятичных цифр (символов из диапазона от 0 до 9, включительно).

В "классической" (не совместимой с POSIX) версии awk, фигурные скобки не могут быть использованы. Однако, в gawk предусмотрен ключ --re-interval, который позволяет использовать (неэкранированные) фигурные скобки.

Язык программирования Perl и некоторые версии egrep не требуют экранирования фигурных скобок.

Круглые скобки -- ( ) -- предназначены для выделения групп регулярных выражений. Они полезны при использовании с оператором " | " и при извлечении подстроки с помощью команды expr.

Вертикальная черта -- | -- выполняет роль логического оператора "ИЛИ" в регулярных выражениях и служит для задания набора альтернатив.

Некоторые версии sed, ed и ex поддерживают экранированные версии регулярных выражений, описанных выше.

Классы символов POSIX. [:class:]

Это альтернативный способ указания диапазона символов.

Класс [:alnum:] -- соответствует алфавитным символам и цифрам. Эквивалентно выражению [A-Za-z0-9].

Класс [:alpha:] -- соответствует символам алфавита. Эквивалентно выражению [A-Za-z].

Класс [:blank:] -- соответствует символу пробела или символу табуляции.

Класс [:cntrl:] -- соответствует управляющим символам (control characters).

Класс [:digit:] -- соответствует набору десятичных цифр. Эквивалентно выражению 7.

Класс [:graph:] (печатаемые и псевдографические символы) -- соответствует набору символов из диапазона ASCII 33 - 126. Это то же самое, что и класс [:print:], за исключением символа пробела.

Класс [:lower:] -- соответствует набору алфавитных символов в нижнем регистре. Эквивалентно выражению [a-z].

Класс [:print:] (печатаемые символы) -- соответствует набору символов из диапазона ASCII 32 - 126. По своему составу этот класс идентичен классу [:graph:], описанному выше, за исключением того, что в этом классе дополнительно присутствует символ пробела.

Класс [:space:] -- соответствует пробельным символам (пробел и горизонтальная табуляция).

Класс [:upper:] -- соответствует набору символов алфавита в верхнем регистре. Эквивалентно выражению [A-Z].

Класс [:xdigit:] -- соответствует набору шестнадцатиричных цифр. Эквивалентно выражению [0-9A-Fa-f].

Вообще, символьные классы POSIX требуют заключения в кавычки или двойные квадратные скобки ([[ ]]).

Эти символьные классы могут использоваться, с некоторыми ограничениями, даже в операциях подстановки имен файлов (globbing).

Примеры использования символьных классов в сценариях вы найдете в Пример 12-14 и Пример 12-15.

Sed, awk и Perl, используемые в сценариях в качестве фильтров, могут принимать регулярные выражения в качестве входных аргументов. См. Пример A-13 и Пример A-19.

Книга "Sed & Awk" (авторы Dougherty и Robbins) дает полное и ясное представление о регулярных выражениях (см. раздел Литература).

Примечания

В качестве простейшего регулярного выражения можно привести строку, не содержащую никаких метасимволов.

Поскольку с помощью sed, awk и grep обрабатывают одиночные строки, то обычно символ перевода строки не принимается во внимание. В тех же случаях, когда производится разбор многострочного текста, метасимвол "точка" будет соответствовать символу перевода строки.

При вводе с терминала управляющие символы (таблица ниже) служат командами драйверу терминала и в большинстве своем, генерируются при помощи сочетания клавиш 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 и ^М

$ date ↵

Вс. февр. 1 22:39:00 MSK 2015

$ hostname ^M

$ whoami ^J

Нажатие клавиши ← Backspace или сочетания клавиш Ctrl+? приводит к генерации управляющего символа DEL, что заставляет драйвер выполнить управляющее действие erase (^?) — удалить последний набранный символ. Аналогично, warese (^W) и kill (^U) удаляют последнее набранное слово и всю набранную строку соответственно.

Управляющие символы ^С и ^\

$ dd if=/dev/dvd of=dvd.iso

^C6227352+0 записей получено

6227351+0 записей отправлено

скопировано 3188403712 байт (3,2 GВ), 2,72618 с, 1,2 GB/c

$ dd if=/dev/cdrom of=cd.iso

^\выход (сделан дамп памяти)

Символы stop (^S) и start (^Q) управляют потоком вывода (и, как следствие, скроллингом терминала), что можно использовать для временной приостановки вывода команд с многострочным выводом. Однако случайное нажатие ^S может привести начинающего пользователя в замешательство— будет казаться, что терминал «завис», т. е. отсутствует реакция со стороны операционной системы на какие-либо нажимаемые клавиши и посылаемые символы, тогда как на самом деле отсутствует (приостановлен) лишь ее вывод— до нажатия ^Q, ^C или ^\.

Управляющий символ eof (^D) используется для оповещения драйвера о завершении ввода, при работе с интерактивными (ведущими с пользователем двусторонний попеременный диалог) программами.

Управляющий символ ^D

Cc: ↵

Subject: Не забыть про Ctrl+D ↵

^D

$ at 21:30

warning: commands will be executed using /bin/sh

at> mplayer

/sounds/alarm.mp3 ↵

at> ^D <E0T>

job 4 at Sat Jan 31 21:30:00 2015

> get /ubuntu/pool/main/n/manpages/manpages_3.74.orig.tar.xz ↵

291196 байтов перемещено за 7 секунд (22б.2Кб/с)

Нужно заметить, что при работе с диалоговыми программами ^C или ^\ завершит выполняющуюся программу (at), не дав ей выполнить свое основное действие, или вообще будет проигнорирован (ftp, mail). Именно символ завершения ввода (eof, end of file) сообщит драйверу о нежелании больше вести диалог с программой (которой в свою очередь сообщит программе об отсутствии для нее вводимых данных).

Управляющий символ ^V

$ tee cc.bin

Ctrl+C: ^C

$ od -ca cc.bin

$ tee cc.bin

Ctrl+C: ^V^C ↵

^D

$ od -ca cc.bin

0000000 C t r l + C : 003 \n

C t r l + C : etx nl

$ hd cc.bin

00000000 43 74 72 6c 2b 43 3a 03 0a |Ctrl+C: |

Реакция драйвера терминала на получаемые управляющие символы и предпринимаемые им управляющие действия (а точнее, наоборот— управляющие символы, закрепленные за управляющими действиями) стандартно предопределена, но почти все эти соответствия могут быть просмотрены и изменены командой stty.

Утилита stty

$ stty -а

speed 38400 baud; rows 38; columns 136; line = 0;

swtch = <undef>; 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

Управляющие символы ^С, ^\ и ^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) и др.

Кавычки, ограничивающие строки с обеих сторон, служат для предотвращения интерпретации специальных символов, которые могут находиться в строке. (Символ называется "специальным", если он несет дополнительную смысловую нагрузку, например символ шаблона -- * .)

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

Примечательно, что "не окавыченный" вариант команды grep [Пп]ервая *.txt будет правильно исполняться в Bash, но не в tcsh.

Вообще, желательно использовать двойные кавычки ( " " ) при обращении к переменным. Это предотвратит интерпретацию специальных символов, которые могут содержаться в именах переменных, за исключением $ , ` (обратная кавычка) и \ (escape -- обратный слэш). [1] То, что символ $ попал в разряд исключений, позволяет выполнять обращение к переменным внутри строк, ограниченных двойными кавычками ( "$variable"), т.е. выполнять подстановку значений переменных (см. Пример 4-1, выше).

Двойные кавычки могут быть использованы для предотвращения разбиения строки на слова. [2] Заключение строки в кавычки приводит к тому, что она передается как один аргумент, даже если она содержит пробельные символы - разделители.

Заключение в кавычки аргументов команды echo необходимо только в том случае, когда разбиение на отдельные слова сопряжено с определенными трудностями.

Пример 5-1. Вывод "причудливых" переменных

Поскольку внутри одиночных кавычек даже экранирующий ( \ ) символ воспринимается как обычный символ, попытка вывести одиночную кавычку внутри строки, ограниченной одинарными кавычками, не даст желаемого результата.

Экранирование -- это способ заключения в кавычки одиночного символа. Экранирующий ( escape ) символ ( \ ) сообщает интерпретатору, что следующий за ним символ должен восприниматься как обычный символ.

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

Специальное назначение некоторых экранированных символов

используемых совместно с echo и sed \n

перевод строки (новая строка)

ASCII-символ с кодом 0xx в восьмеричном виде)

Пример 5-2. Экранированные символы

символ доллара (если за комбинацией символов \$ следует имя переменной, то она не будет разыменована)

Поведение символа \ сильно зависит от того экранирован ли он, ограничен ли кавычками или находится внутри конструкции подстановки команды или во вложенном документе.

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

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

Кроме того, escape -символ позволяет писать многострочные команды. Обычно, каждая команда занимает одну строку, но escape -символ позволяет экранировать символ перевода строки , в результате чего одна команда может занимать несколько строк.

Если строка сценария заканчивается символом создания конвейера | , то необходимость в применении символа \ , для экранирования перевода строки, отпадает. Тем не менее, считается хорошим тоном, всегда использовать символ "\" в конце промежуточных строк многострочных команд.

Примечания

Не менее любопытно поведение символа "\" , употребляемого внутри двойных кавычек.

(Спасибо Wayne Pollock за пояснения.)

"Разбиение на слова" , в данном случае это означает разделение строки символов на некоторое число аргументов.

Добрый день. Не получается экранирования символа ";" Bash его просто пропускает. Кто нибудь сталкивался с такой проблемой? Спасибо.


реально в bash нельзя экранировать !, приходится в одинарные " заключать.

Spoofing ★★★★★ ( 02.06.16 11:52:05 )
Последнее исправление: Spoofing 02.06.16 11:52:46 (всего исправлений: 1)


Пример своей команды покажи.

вот так \; - не прокатывает


или так tmpvar1=$tmpvar1$ '\;' '\n'

P. S. Не работало потому, что в одинарных кавычках.

Kroz ★★★★★ ( 02.06.16 12:29:15 )
Последнее исправление: Kroz 02.06.16 12:29:51 (всего исправлений: 1)

нет времени объяснять. man bash

Любимый лорчик пересрал кавычки, но все же ясно, что " делает что-то ненужное. Например, мешает экранировать.

По ходу при склейке строк происходит исчезновение ";"


Нет, никто не сталкивался

По ходу при склейке строк происходит исчезновение ";"

Ты можешь наконец-то привести пример, который у тебя не работает? Чтобы его вставить в командную строку и убедиться в этом? А рядом показать что хотелось бы получить на выходе?

Ибо у меня никакого исчезновения не происходит:

tmpfile1=$(cat file.php) IFS=';' set — $tmpfile1

while [ '$1' ] ; do tmpvar1='$1;' echo $tmpvar1 shift done

file.php - любой файл php

c двойными кавычками - то же

Подтверждаю. Не сталкивался.

1. Пожалуйста, оберни это в [code] [/code] . И вообще прочитай про LORCODE

Что это должно делать? Ты хочешь запустить php скрипт? Зачем тогда читать его в переменную?


У тебя бесконечный цикл. Ибо строка '$1' всегда true.
Ты хочешь что-то делать с параметрами скрипта? Тогда используй двойные кавычки: только там интерпретируются переменные. И никогда не используй [ ], всегда двойные [[ ]]. Кроме того, я не понимаю какое это имеет отношение к задаче в топике.


И никогда не используй [ ], всегда двойные [[ ]].

это ещё почему? двойные, например, не умеют -o

ЕМНИП это один из башизмов — во всяком случае не во всех шеллах эта конструкция реализована. Чтобы привязаться к 1 интерпретатору, очевидно же!

это ещё почему? двойные, например, не умеют -o


И никогда не используй [ ], всегда двойные [[ ]].

это ещё почему? двойные, например, не умеют -o

-a и -o во-первых некороткозамкнутые так как [ имеет семантику команды, а не ключевого слова и во-вторых изначально не нужны т.к.

The binary -a and -o, and ( / ) (grouping) operators are XSI extensions to the POSIX standard. All are marked as obsolescent in POSIX-2008. They should not be used in new code. One of the practical problems with [ A = B -a C = D ] (or -o) is that POSIX does not specify the results of a test or [ command with more than 4 arguments. It probably works in most shells, but you can't count on it. If you have to write for POSIX shells, then you should use two test or [ commands separated by a && operator instead.

Читайте также: