Использование bash regex match ( = ~ ), где regex включает кавычки ("символы)
Я хочу использовать bash regex matching (с оператором=~) для сопоставления строки, которая содержит кавычки. Скажем, например, у меня есть следующая строка, и я хочу извлечь текст между кавычками:
foo='"Hello World!"'
Моей первой попыткой было поместить регулярное выражение в сильные кавычки, например, чтобы заставить кавычки быть обычными символами.
[[ "$foo" =~ '".*"' ]]
Это не удается, потому что Bash интерпретирует это как совпадение строк, а не регулярное выражение.
Затем я попытался избежать кавычек с like Итак:
[[ "$foo" =~ ".*" ]]
Это не удается (EDIT: на самом деле, это не так.это не удается, если нет пространства между " и ]] но версия здесь работает просто отлично.) потому что первый находится в простом тексте bash и не может избежать цитаты (Я думаю. Раскраска в VIM указывает на то, что вторая цитата экранирована, но не первая, и запуск скрипта завершается неудачей).
Итак, есть ли какой-то способ, которым я могу избежать символов " без преобразования соответствия регулярного выражения в соответствие строки?
1 ответ:
На самом деле, ваша вторая попытка работает для меня в Баш 3 и 4:
Однако, чтобы поговорить о теории на секунду, все это имеет отношение к тому, как Баш интерпретирует выражение в целом. До тех пор, пока сами символы регулярного выражения не будут заключены в кавычки, остальная часть выражения может быть заключена в кавычки без побочных эффектов:$ echo "$BASH_VERSION" 3.2.51(1)-release $ echo "$foo" "Hello World!" $ [[ "$foo" =~ \".*\" ]] && echo $BASH_REMATCH "Hello World!" $ echo "$BASH_VERSION" 4.3.18(1)-release $ echo "$foo" "Hello World!" $ [[ "$foo" =~ \".*\" ]] && echo "${BASH_REMATCH[0]}" "Hello World!"Но, возможно, самый простой способ-использовать вторую переменную для хранения самого регулярного выражения.$ [[ $foo =~ '"'.*'"' ]] && echo $BASH_REMATCH "Hello World!"$ exp='".*"' $ [[ $foo =~ $exp ]] && echo $BASH_REMATCH "Hello World!"
Comments