Как извлечь строку, заключенную в одинарные кавычки в Perl? - PullRequest
4 голосов
/ 04 января 2012

Как извлечь abc из 'abc' с помощью регулярного выражения perl?

Я пытался

echo "'abc'" | perl -ne 'if(/\'(.*)\'/) {print $1}'

, но он показывает -bash: синтаксическая ошибка рядом с неожиданным токеном `('

Заранее спасибо за ваш ответ.

Ответы [ 6 ]

7 голосов
/ 04 января 2012

Это не проблема perl, это проблема оболочки: вы не можете включать одинарные кавычки в одинарные кавычки.

Вы должны заменить каждую одинарную кавычку на '\'' (конец одинарных кавычек, экранированный одинарныйцитата, начало цитат)

echo "'abc'" | perl -ne 'if(/'\''(.*)'\''/) {print $1}'
3 голосов
/ 05 января 2012

Перед вашим Perl-кодом, заключенным в одинарные кавычки, со знаком доллара, чтобы bash использовал альтернативный метод цитирования , который отключает расширение оболочки:

echo "'abc'" | perl -ne $'if(/\'(.*)\'/) {print $1}'
2 голосов
/ 04 января 2012

ответ Чоробы решает точную проблему.Для обобщенного решения любой проблемы цитирования используйте String :: ShellQuote :

                $ alias shellquote='perl -E'\''
                    use String::ShellQuote qw(shell_quote);
                    local $/ = undef;
                    say shell_quote <>;
                '\'''
                $ shellquote
user input →    if(/'(.*)'/) {print $1}␄
perl output →   'if(/'\''(.*)'\''/) {print $1}'
2 голосов
/ 04 января 2012

Ну, самый дешевый способ - не заключать в оператор perl одинарные кавычки:

echo "'abc'" | perl -ne "if(/'(.*)'/) {print $1}" 

В экранировании оболочки есть странные правила ...

Если вы действительно хотите это сделать«правильный» способ, которым вы можете завершить свою первую строку в одинарных кавычках, вставить цитату и начать другую:

echo "'abc'" | perl -ne 'if(/'\''(.*)'\''/) {print $1}'
1 голос
/ 04 января 2012

У вас проблема с цитированием оболочки, а не проблема Perl.

Это хорошее применение для sed:

echo "'abc'" | sed "s/'//g"
1 голос
/ 04 января 2012

вам нужно покинуть свой одиночный квот с '\' '

echo "'abc'" | perl -ne 'if( /'\''(.*)'\''/ ){print $1}'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...