В регулярных выражениях Bash `^` и `$` относятся к строкам или ко всей строке? - PullRequest
3 голосов
/ 09 января 2020

In Проект документации Linux (я не нашел подробностей о метасимволах регулярных выражений в Bash руководстве ), метасимволах ^ и $ определяются как совпадающие строки:

^: соответствует пустой строке в начале строки [...]
$: соответствует пустой строке в конце строки line

однако, когда я пытаюсь, это не правильно:

$ string="a
> b
> c"

$ [[ $string =~ ^a ]] && echo BOS match
BOS match

$ [[ $string =~ ^b ]] && echo BOL match
# nothing

Действительно ли руководства неверны, или я что-то упустил?

1 Ответ

3 голосов
/ 09 января 2020

^ соответствует началу всей входной строки, а $ соответствует концу всей входной строки в регулярном выражении POSIX (Bash использует POSIX ERE). В документе, на который вы ссылаетесь, упоминаются строки, поскольку большинство инструментов обработки текста, таких как sed, grep или awk, по умолчанию читают строку ввода построчно, и в большинстве случаев строка совпадает со строкой.

См. Документация по регулярным выражениям POSIX :

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

  1. Круговой знак ('^') должен быть якорем при использовании в качестве первого символа всего BRE , Реализация может обрабатывать окружность как привязку, когда используется как первый символ подвыражения. Обхват должен привязывать выражение (или, возможно, подвыражение) к началу строки; только последовательности, начинающиеся с первого символа строки, должны соответствовать с помощью BRE. Например, BRE «^ ab» соответствует «ab» в строке «abcdef», но не соответствует в строке «cdefab». BRE "(^ ab)" может соответствовать предыдущей строке. Переносной BRE должен избегать ведущего окружного в подвыражении, чтобы соответствовать буквальному окружному.

  2. Знак доллара ('$') должен быть якорем, когда используется как последний символ целого BRE. Реализация может обрабатывать знак доллара как якорь, когда используется как последний символ подвыражения. Знак доллара должен привязывать выражение (или, возможно, подвыражение) к концу сопоставляемой строки; можно сказать, что знак доллара соответствует концу строки после последнего символа.

  3. BRE, привязанный как '^', так и '$', должен соответствовать только вся строка Например, BRE "^abcdef$" соответствует строкам, состоящим только из "abcdef".

...