2012-06-21 2 views
0

Эй, ребята, это должно быть просто, я просто не вижу его, я хотел бы создать регулярное выражение (выполнимое в PERL, Awk, SED/* nix), которое будет работать после того, как оно найдет ($), самый следующий Equal (=) и работайте над тем, что находится между первым экземпляром двойных или одинарных кавычек для последнего экземпляра двойных или одинарных кавычек.Regex для работы после двух условий

Позвольте мне привести несколько примеров.

$this = 'operate on some text in here'; # operates between single quotes 
$this = "operate on some text in here"; # operates between double quotes 
$this = 'operate "on some text" in here'; # operates between single quotes 
$this = 'operate \'on some text\' in here'; # operates between outer single quotes 

Я пробовал некоторые действительно плохие регулярные выражения. но просто не мог заставить его соответствовать.

Вот что я вставив его в случае anyones заинтересованных

printf '$request1 = "select * from whatever where this = that and active = 1 order by something asc";\n' | 
grep '{regex}' * | 
perl -pe 's/select/SELECT/g ; s/from/\n FROM/g ; s/where/\n  WHERE/g ; s/and/\n  AND/g ; s/order by/\n   ORDER BY/g ; s/asc/ASC/g ; s/desc/DESC/g ;' | ## enter through file with all clauses 
awk '{gsub(/\r/,"");printf "%s\n%d",$0,length($0)}' ## take first line convert to whitespace, use on following lines 

Спасибо, ребята!

ответ

2

Сценарий:

@list = <main::DATA>; 

foreach (@list) { 
    my @x = /^\s*\$(\S+)\s*=\s*(['"])((?:.(?!\2)|\\\2)*.?)\2\s*;/; 
    $x[2] =~ s/\\$x[1]/$x[1]/g; # remove backslash before quote character 
    print "$x[0]\t$x[2]\n"; 
} 

__DATA__ 
$this = 'operate on some text in here';  // operates between single quotes 
$this = "operate on some text in here";  // operates between double quotes 
$this = 'operate "on some text" in here'; // operates between single quotes 
$this = 'operate \'on some text\' in here'; // operates between outer single quotes 

даст вам:

this operate on some text in here 
this operate on some text in here 
this operate "on some text" in here 
this operate 'on some text' in here 
+0

Я бы не хотел, чтобы это или что-то еще, кроме var, было до кавычек, хотя для проклятого хорошего ответа – ehime

+0

@ehime - if вам нужен только правильный сайт уравнения, а затем измените 'print' на' '$ x [2] \ n" 'только. –

+0

Как я могу запустить это/объединить это с моим текущим кодом? – ehime

5

Как правило, если вы анализируете фактический код perl, я бы предложил (и использовал) PPI. В противном случае, просто используйте Regexp::Common

use Regexp::Common; 

my @lines = split /\s*\n\s*/, <<'TEST'; 
$this = 'operate on some text in here'; // operates between single quotes 
$this = "operate on some text in here"; // operates between double quotes 
$this = 'operate "on some text" in here'; // operates between single quotes 
$this = 'operate \'on some text\' in here'; // operates between outer single quotes 
TEST 

for (@lines) 
{ 
    /$RE{quoted}{-keep}/ && print $1, "\n"; 
} 

Дает:

$ perl x.pl 
'operate on some text in here' 
"operate on some text in here" 
'operate "on some text" in here' 
'operate \'on some text\' in here' 
+0

@ZnArK - если вы собираетесь «исправить» мой код, проверить свое затруднительное первым. Он даже не приблизился к созданию правильной продукции. Вы также заметите, что я показал результат из исходного кода, который показывает, что в коде отсутствует ошибка. (Те, кто одобрил ваше редактирование, также не проверяли его.) Я был вынужден вернуть его, чтобы он был прав. – Tanktalus

+0

@Tanktalus Я не отлаживал ваш код для вас, только исправлял комментарии, чтобы он был отформатирован правильно. Является ли '//' правильная раскладка комментариев для perl? – ZnArK

+0

@ Танкталус Теперь я вижу, почему это работает. Угадайте, что префикс не интерпретирует perl правильно .... – ZnArK

0

Это может работать для вас:

sed 's/\(\$[^=]*=[^'\''"]*\)\(['\''"]\)[^\\'\''"]*\(\\['\''"][^'\''"]*\)*\2/\1\2Replacement\2/' file 
Смежные вопросы