2017-01-09 11 views
-3

У меня есть ряд файлов, каждый из которых начинается с предложенияИспользование Perl (или назад 'предпросмотр), чтобы захватить слово

создать табличное пространство имя-табличного data.dbf

мне нужно для извлечения табличного пространства-имени и замените data.dbf на tablespace-name .dbf.

Я новичок в perl, но похоже, что мне нужно, чтобы посмотреть (или смотреть вперед) регулярное выражение в perl.

Как это можно сделать?

+0

Вы можете попробовать использовать подстановку: 's/^ (create tablespace) (tablespace-name) (data.dbf)/$ 1 $ 2 $ 2.dbf /' –

+0

* tablespace-name * отличается в каждом файле, и у меня есть нет прежних знаний о том, что это будет. Вот почему я подумал, что лучше использовать lookahead или lookbehind, чтобы получить слово перед «data.dbf» или слово после «табличного пространства». – Peter

+0

Хорошо, я вижу :) Тогда вы также можете попробовать: 's/^ (create tablespace) (\ S +) (data.dbf)/$ 1 $ 2 $ 2.dbf /' –

ответ

0
if (defined($_ = <>)) { 
    s/^create \s+ tablespace \s+ (\S+) \s+ \K data (?= \.dbf \b)/$1/x; 
    print; 

    print while <>; 
} 

Технически, выглядят обходные и \K здесь не нужны.

s/^ (create \s+ tablespace \s+) (\S+) (\s+) data (\.dbf \b)/$1$2$3$2$4/x 

Они просто делают вещи менее шумными.

+0

Я думаю, что ваше редактирование содержит ненужные пробелы, не означает ли вы '^ create \ s + табличное пространство \ s + (\ S +) \ s + \ Kdata (? = \. Dbf \ s * \ z)' – AbhiNickz

+2

@AbhiNickz, что быть эквивалентным, но менее читаемым. Обратите внимание на использование '/ x'. Это делает пробелы несущественными, позволяя одному добавить пробелы для удобства чтения, как в обычном коде Perl. – ikegami

+0

См. Эту ссылку: ваше регулярное выражение не работает [regex] (https://regex101.com/r/rlVC2J/1) – AbhiNickz