Яке значення [[: space:]] в баші?


23

Я щойно натрапив на баш сценарій. Що [[:space:]]означає сценарій bash? Чому подвійна кишка?

Відповіді:


35

Дійсно, це посібник з 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>Портативного набору символів, і будь-які символи , включені в клас заготовки автоматично включаються в цей клас.


1
Простіше знайти відповідність вручну, LESS=+'/Within \[ and \],' man bashа не 32 nкоманди ext :-).
Ісаак

5
@Isaac Я думаю, що справа в тому, щоб навчити людину ловити рибу. Це сказав, я не знав про це less +"$cmd", тому дякую за це.
JoL

3
Дійсно, я відповів, враховуючи перспективу ОП; їм можна було б простити за те, що вони не зрозуміли, що зовнішнє []не залежить від внутрішнього []. Я намагався (!) Знайти шлях від запитання до відповіді, не знаючи занадто багато про те, що відповідь, хоча знадобилося кілька щасливих здогадок :)
Джефф Шаллер

17

Це не лише для 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


1
[[:ascii:]], і [[:word:]]не є класами POSIX (вони, здається, є bashспецифічними), і я не можу знайти [[:<:]]ні того, ні [[:>:]]іншого. Краще посилання може бути pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
Kusalananda

1
Так, [[:ascii:]]і [[:word:]]немає жодного стандартного класу POSIX. бо [[:<:]]і [[:>:]]я не можу знайти жодних посилань, але це так само \b. en.wikipedia.org/wiki/Regular_expression#Character_classes
Німа

Postgres визначає використання [[:<:]]та стверджує, що: Це розширення, сумісне з POSIX 1003.2, але не визначене
Isaac

[[:<:]]також у FreeBSD, з тим самим застереженням, що і PostgreSQL: freebsd.org/cgi/…
ilkkachu

1
А [[:ascii:]]та [[:word:]], звичайно ж, робота в Bash в зіставленні з зразком, але не в регулярних виразах (принаймні , в моїй системі, я думаю , що Bash використовує бібліотеку регулярних виразів системи). Ба.
ilkkachu

9

У регулярних виразах і шаблонах імен глобусів / оболонок [...]конструкція відповідає будь-якому одному символу з тих, що вказані в дужках. У цих дужках може використовуватися ряд названих стандартних класів символів . Одне з них - це те [: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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.