Использование bash regex match ( = ~ ), где regex включает кавычки ("символы)



Я хочу использовать bash regex matching (с оператором=~) для сопоставления строки, которая содержит кавычки. Скажем, например, у меня есть следующая строка, и я хочу извлечь текст между кавычками:



foo='"Hello World!"'


Моей первой попыткой было поместить регулярное выражение в сильные кавычки, например, чтобы заставить кавычки быть обычными символами.



[[ "$foo" =~ '".*"' ]]


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



Затем я попытался избежать кавычек с like Итак:



[[ "$foo" =~ ".*" ]]


Это не удается (EDIT: на самом деле, это не так.это не удается, если нет пространства между " и ]] но версия здесь работает просто отлично.) потому что первый находится в простом тексте bash и не может избежать цитаты (Я думаю. Раскраска в VIM указывает на то, что вторая цитата экранирована, но не первая, и запуск скрипта завершается неудачей).



Итак, есть ли какой-то способ, которым я могу избежать символов " без преобразования соответствия регулярного выражения в соответствие строки?

494   1  

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

    Ничего не найдено.