2013-12-21 3 views
0

Я искал ответ на этот вопрос здесь, в stackoverflow, но не могу получить приемлемые результаты. (К сожалению!)нужно regexp, чтобы помочь мне извлечь данные из двойных кавычек

У меня есть файл данных, который выглядит следующим образом:

share "SHARE1" "/path/to/some/share" umask=022 maxusr=4294967295 netbios=SOMECIFSHOST 
share "SHARE2" "/path/to/a/different/share with spaces in the dir name" umask=022 maxusr=4294967295 netbios=ANOTHERCIFSHOST 

... от которой мне нужно извлечь значения в двойных кавычках. Другими словами, я хотел бы получить что-то вроде этого:

share,SHARE1,/path/to/some/share/,umask=022,maxusr=4294967295,netbios=SOMECIFSHOST 
share,SHARE2,/path/to/a/different/share with spaces in the dir name,umask=022,maxusr=4294967295,netbios=ANOTHERCIFSHOST 

Хитрость я нашел в попытке извлечь данные в кавычках. Предложения, сделанные здесь, не сработали для меня, поэтому я предполагаю, что я просто делаю это неправильно. Мне также нужно извлечь значения BOTH из строк с двумя кавычками каждой строки, а не только из первого; Я полагаю, что оставшаяся часть может быть легко проанализирована путем разделения на пробелы.

В случае, если это актуально, я запускаю это в поле RHEL, и мне нужно вытащить его с помощью регулярного выражения с использованием Perl.

Thx!

+0

Какие предложения? Сделано где? Дайте нам некоторую историю, или вы, вероятно, получите тот же совет. Покажите код, который вы пробовали. – toolic

+0

Я не вижу разницы между входом и ожидаемым выходом, который просто швы разделяется запятыми с удаленными цитатами ... –

+0

Просто используйте что-то вроде [this] (http://stackoverflow.com/a/18217486), а затем разделите кавычки? – HamZa

ответ

1

Вы можете сделать это:

если буквальные кавычки внутри кавычек экранируются обратной косой черты: share "SHA \" RE1" ...

$str =~ s/(?|"((?>[^"\\]++|\\{2}|\\.)*)"|()) /$1,/gs; 

если буквальные кавычки экранируются другая цитата: share "SHA "" RE1" ...

$str =~ s/(?|"((?>[^"]++|"")*)"|()) /$1,/g; 

если вы являются Absolutly уверены, что нет спасся цитаты в кавычки во всех ваших данных:

$str =~ s/(?|"([^"]*)"|()) /$1,/g; 
0

Попробуйте это.

[^\" ]* 

Он выбирает каждый символ, кроме кавычек и пробелов.

0

Не уверен, если я понимаю, вопрос, вы говорите одно, в тексте, но пример говорит что-то другое, annyway, попробуйте следующее:

#!/usr/bin/env perl 
use strict; 
use warnings; 

while (<DATA>) { 
    chomp; 
    my @matches = $_ =~ /"(.*?)"/g; 
    print "@matches\n"; 
} 

__DATA__ 
share "SHARE1" "/path/to/some/share" umask=022 maxusr=4294967295 netbios=SOMECIFSHOST 
share "SHARE2" "/path/to/a/different/share with spaces in the dir name" umask=022 maxusr=4294967295 netbios=ANOTHERCIFSHOST 

выход:

$ ./p.pl 
SHARE1 /path/to/some/share 
SHARE2 /path/to/a/different/share with spaces in the dir name 
+0

Довольно точно, что регулярное выражение должно быть' /"(.*?) "/ g' или'/"([^"] *) "/ g', чтобы избежать жадного соответствия ... –

+0

Рад, что кто-то обращает внимание. Вы правы! –

0
my $str = 'share "SHARE1" "/path/to/some/share" umask=022 maxusr=4294967295 netbios=SOMECIFSHOST'; 
$str =~ s/"?\s*"\s*/,/g; 
print $str; 

Это регулярное выражение заменяет, как показано ниже:
"space" =,
"space =,
пространство»=,
""=,

+2

Возможно, вы должны добавить немного объяснения этому ... – jeremy

+1

Спасибо, добавлено. Мой модуль Perl YAPE :: Regex :: Explain не устанавливается на моем компьютере. В противном случае я мог бы объяснить это лучше. –

+1

@sabujhassan Вы имеете в виду что-то вроде [этого] (http://rick.measham.id.au/paste/explain.pl): P? – HamZa

2

Одним из вариантов является для лечения данных в файл CSV и использовать Text::CSV_XS разобрать его, установив разделитель в пространство:

use strict; 
use warnings; 
use Text::CSV_XS; 

my $csv = Text::CSV_XS->new({ binary => 1, sep_char => ' ' }) 
    or die "Cannot use CSV: " . Text::CSV->error_diag(); 

open my $fh, "<:encoding(utf8)", "data.txt" or die "data.txt: $!"; 
while (my $row = $csv->getline($fh)) { 
    print join ',', @$row; 
    print "\n"; 
} 
$csv->eof or $csv->error_diag(); 
close $fh; 

Вывода на наборе данных:

share,SHARE1,/path/to/some/share,umask=022,maxusr=4294967295,netbios=SOMECIFSHOST 
share,SHARE2,/path/to/a/different/share with spaces in the dir name,umask=022,maxusr=4294967295,netbios=ANOTHERCIFSHOST 

Надеются, что это помогает!

0
#!/usr/bin/env perl 
while(<>){ 
    my @a = split /\s+\"|\"\s+/ , $_;  # split on any spaces + ", or any " + spaces 
    for my $item (@a) { 
     if ($item =~ /\"/) {   # if there's a quote, remove 
      $item =~ s/\"//g;    
     } elsif ($item !~ /\"/){  # else just replace spaces with comma 
      $item =~ s/\s+/,/g; 
     }    
    } 
    print join(",", @a); 
    print "\n"; 
} 

выход:

share,SHARE1,/path/to/some/share,umask=022,maxusr=4294967295,netbios=SOMECIFSHOST, 
share,SHARE2,/path/to/a/different/share with spaces in the dir name,umask=022,maxusr=4294967295,netbios=ANOTHERCIFSHOST, 

Оставьте его к вам, чтобы удалить последнюю запятую :)

Смежные вопросы