Информация об извлечении от текстового файла

Можно временно удалить/запретить конфетку repo путем добавления - disablerepo = (reponame) к вкусной строке.

yum --disablerepo=some-repository install some-package

К сожалению, это - единственный способ сделать это с yum/sudo

3
06.11.2013, 20:58
2 ответа

Это похоже на своего рода XML или подобный файл языка разметки. Такие файлы не должны быть проанализированы простыми регулярными выражениями из страха пробуждения К ͇̹̺ͅƝ ̴ȳ ̳ TH̘E ͖̈́̉ ͠P ̯͍̭ O ̚​ N̐Y ̡. Необходимо использовать синтаксический анализатор, специфичный для той разметки и любимого языка сценариев вместо этого.

Это похоже на OMIM или данные HPO, в этом случае, необходимо смочь получить простые текстовые файлы и упростить вещи. Если Вы не можете и действительно действительно должны проанализировать этот файл, Вы могли бы сделать это в жемчуге:

perl -lne '/<.*?>([^<>]+)/ && print $1' foo.txt

Однако это повредится, если у Вас будет несколько тегов на строку, или если содержание Вашего тега может охватить несколько строк или если данные тега могут содержать > или <. Если вся Ваша информация всегда между <category="whatever">blah blah</category>, можно добраться, все более надежно (включая много строку отмечают содержание и встроенный < или >):

#!/usr/bin/env perl

## Set the start and end tags
$end="</category>"; 
$start="<category=.*?>"; 

## Read through the file line by line
while(<>){
    ## set $a to one if the current line matches $start
    $a=1 if /$start/; 
    ## If the current line matches $start, capture any relevant content.
    ## I am also removing any $start or $end tags if present.
    if(s/($start)*(.+)($end)*/$2/){
    push @lines,$2 if $a==1;
    }  
    ## If the current line matches $end, capture any relevant content,
    ## print what we have saved so far, set $a back to 0 and empty the
    ## @lines array
    if(/$end/){
    map{s/$end//;}@lines; 
    print "@lines\n";
    @lines=(); 
    $a=0
    }; 
}

Сохраните этот сценарий как foo.pl или что бы то ни было, сделайте это исполняемым файлом и выполните его на своем файле:

./foo.pl file.txt

Например:

$ cat file.txt 
<category="SpecificDisease">Type II 
 human complement C2 deficiency</category>
<category="Modifier">Huntington disease</category>
<category="CompositeMention">hereditary breast < and ovarian cancer</category>
<category="DiseaseClass">myopathy > cardiopathy</category>

$ ./foo.pl file.txt 
Type II   human complement C2 deficiency
Huntington disease
hereditary breast < and ovarian cancer
myopathy > cardiopathy

Еще раз, хотя, я подчеркиваю, что, если (который вероятен) Ваш файл будет более сложным, чем пример выше, то это перестанет работать, и будут необходимы более сложные методы.

7
27.01.2020, 21:09
  • 1
    +1 для ссылки на это (в) известном ТАК ответ. Просто для уточнения для OP: причиной для печально известных Вопросов и ответов является тенденция людей настоять, что regexps прекрасны, потому что они слишком ленивы, чтобы изучить, как использовать синтаксический анализатор, и дело в том, что можно сделать это правильно (с синтаксическим анализатором), или можно рискнуть (с regexp). Тем не менее, как terdon говорит, если Вы уверены файлы, Вы анализируете, всегда имеют ту же идентичную структуру, regexp жизнеспособен. Просто не используйте их обычно с полным HTML/XML-документами. –  goldilocks 06.11.2013, 21:23
  • 2
    @goldilocks для Не противоречия (очень допустимой) точке но я полагаю, что (ir) регулярные выражения Perl с их многими дополнительными свойствами могут использоваться для создания грамматики, которая может эффективно проанализировать (правильно построенные) файлы разметки. Исправьте меня, если я неправ, и у Вас есть опыт об обратном. –  Joseph R. 06.11.2013, 21:36
  • 3
    Не уверенный, какой синтаксический анализатор XML мог использоваться. Кодом, отправленным в вопросе, является ясно не XML. –  manatwork 06.11.2013, 21:37
  • 4
    @JosephR. Я думаю, что это зависит от того, что Вы пытаетесь извлечь - существуют неизбежно конкретные случаи, которые могут быть сделаны с regexp, затем у Вас есть встречный иск, который не может - таким образом, Вы совершенствовали regexp (вложите их! глубоко!) - затем и т.д. существует другой различный встречный иск. Так как жемчуг также имеет HTML::Parser, Я не вижу много точки в дебатах. Я должен доказать, что могу подняться на стену, ослепленную одной рукой за моей спиной, когда существует доступная лестничная структура и никакая потребность в препятствиях? Если бы я мог, я затем рекомендовать это на практике по сравнению с лестничной структурой? Nah. –  goldilocks 06.11.2013, 21:53
  • 5
    @manatwork Хорошая выгода. –  goldilocks 06.11.2013, 21:56

Можно сделать это просто в sed:

sed 's/>\([^>]\+\)</\1/' your_file > new_file

извлечь текст между > и < на каждой строке. Это предполагает, что у Вас есть один тег на строку.

4
27.01.2020, 21:09

Теги

Похожие вопросы