Відповіді:
Дійсно, це посібник з bash, але це допомагає знати, що ви шукаєте, що не корисно, якщо ви не знаєте, що шукаєте. Якщо ви шукали, [[
вас відволікає розділ [[ expression ]]
умовного вираження. Крім того, шукайте :space:
землю на двох прикладах у тому ж розділі. Ви можете дотримуватися сухар у цьому прикладі:
Наприклад, наступне буде відповідати рядку (зберігається в рядку змінної оболонки), якщо є послідовність символів у значенні, що складається з будь-якого числа, включаючи нуль, символів пробілу, нуля або одного екземпляра 'a', то a 'b':
[[ $line =~ [[:space:]]*?(a)b ]]
... з чого ви могли скласти разом, що [[:space:]]
частина відповідає "космічним персонажам", але ви можете пробачити, подумавши, що це лише буквальний простірний персонаж, а не цілий клас персонажів, який він представляє.
Якщо ви (трапляєтесь?) Шукаєте рядок " space"
(тобто пробіл, за яким слідує слово "пробіл"), в Інтернетному посібнику з bash , пройти "лише" близько 32 матчів. Близько десятої буде тут:
У межах '[' і ']' класи класів символів можуть бути визначені за допомогою синтаксису [: class:], де клас є одним із таких класів, визначених у стандарті POSIX:
alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
Клас символів відповідає будь-якому символу, що належить до цього класу.
Тоді ви перейдете до стандарту POSIX, де ви можете шукати термін "клас символів" і знаходити
wctype, wctype_l - визначте клас символів , який дає вам:
Функції wctype () [CX] [Option Start] та wctype_l () [Option End] повинні визначати значення wctype_t відповідно до правил кодованого набору символів, визначеного інформацією про тип символів у поточному локалі [CX] [Option Start] або в локалі, представленому locale, [Option End] відповідно (категорія LC_CTYPE).
Якщо ви перейшли до посилання setlocale , ви нарешті дістанетесь до своєї реальної відповіді в розділі Місцевий пошук :
простір
Визначте символи, які слід класифікувати як пробіли. В мові POSIX точно
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
потрібно включати.У файлі визначення локального запису жоден символ, вказаний для ключових слів верхній, нижній, альфа, цифра, графік або xdigit, не повинен бути вказаний.
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
Портативного набору символів, і будь-які символи , включені в клас заготовки автоматично включаються в цей клас.
less +"$cmd"
, тому дякую за це.
[]
не залежить від внутрішнього []
. Я намагався (!) Знайти шлях від запитання до відповіді, не знаючи занадто багато про те, що відповідь, хоча знадобилося кілька щасливих здогадок :)
Це не лише для Bash, воно є частиною позначення POSIX.
Що таке POSIX?
POSIX або "Інтерфейс портативної операційної системи для uniX" - це сукупність стандартів, які визначають деякі функції, які повинна підтримувати операційна система (UNIX). Один із цих стандартів визначає два аромати регулярних виразів.
POSIX дужкові вирази
Виразні дужки POSIX - це особливий вид класів символів. Виразні дужки POSIX відповідають одному символу з набору символів, як і звичайні класи символів.
Стандартний POSIX
[[:alnum:]] Alphanumeric characters
[[:alpha:]] Alphabetic characters
[[:blank:]] Space and tab
[[:cntrl:]] Control characters
[[:digit:]] Digits
[[:graph:]] Visible characters (anything except spaces and control characters)
[[:lower:]] Lowercase letters
[[:print:]] Visible characters and spaces (anything except control characters)
[[:punct:]] Punctuation (and symbols).
[[:space:]] All whitespace characters, including line breaks
[[:upper:]] Uppercase letters
[[:xdigit:]] Hexadecimal digits
Ніякі стандарти
[[:ascii:]] ASCII characters
[[:word:]] Word characters (letters, numbers and underscores)
застарілий синтаксис (чи може хтось знайти посилання на них?)
[[:<:]] Start of Word
[[:>:]] End of Word
Більше інформації ви можете знайти тут: wiki
[[:ascii:]]
, і [[:word:]]
не є класами POSIX (вони, здається, є bash
специфічними), і я не можу знайти [[:<:]]
ні того, ні [[:>:]]
іншого. Краще посилання може бути pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
[[:ascii:]]
і [[:word:]]
немає жодного стандартного класу POSIX. бо [[:<:]]
і [[:>:]]
я не можу знайти жодних посилань, але це так само \b
. en.wikipedia.org/wiki/Regular_expression#Character_classes
[[:<:]]
та стверджує, що: Це розширення, сумісне з POSIX 1003.2, але не визначене
[[:<:]]
також у FreeBSD, з тим самим застереженням, що і PostgreSQL: freebsd.org/cgi/…
[[:ascii:]]
та [[:word:]]
, звичайно ж, робота в Bash в зіставленні з зразком, але не в регулярних виразах (принаймні , в моїй системі, я думаю , що Bash використовує бібліотеку регулярних виразів системи). Ба.
У регулярних виразах і шаблонах імен глобусів / оболонок [...]
конструкція відповідає будь-якому одному символу з тих, що вказані в дужках. У цих дужках може використовуватися ряд названих стандартних класів символів . Одне з них - це те [:space:]
, що відповідає символам пробілів (наприклад, \s
у регексах Perl). Дивіться, наприклад, Збірка шаблонів у посібнику Баша
Отже, [[:space:]]
є частиною регулярного збігу виразів або зразків, що відповідає простому пробілу.
Наприклад, відповідність шаблону (стандартна оболонка, а не Bash):
case $var in
*[[:space:]]*) echo "'$var' contains whitespace";;
esac
або регулярний вираз (Bash):
if [[ $var =~ [[:space:]] ]]; then
echo "'$var' contains whitespace"
fi
Зауважте, що хоч вирази дужок [...]
працюють однаково у звичайних виразах та шаблонах оболонок, вони, як правило, не однакові. ( case
і [[ string == pattern ]]
використовувати відповідність шаблонів, [[ string =~ regex ]]
використовує регулярні вирази.)
Регулярні вирази також не стосуються оболонки, вони використовуються, наприклад, awk
і sed
занадто, і описані, наприклад, на сторінці man man на Linuxregex(7)
LESS=+'/Within \[ and \],' man bash
а не 32n
команди ext :-).