Попытка найти определенную строку в файле с помощью RegEx - PullRequest
0 голосов
/ 13 июня 2018

У меня есть файл в следующем формате:

define host{
     use             generic-printer
     host_name       imp-p-125
     address         100.68.22.10
     hostgroups      network-printers
    }

 define service{
        use     generic-service
        host_name       imp-p-125
        service_description     Toner 1 Status
        check_command   check_toner1
        check_interval  240
        retry_interval  2
        notification_interval   245
        }

Я пытаюсь найти строку host_name (1imp-p-1251), с целью не повторять хост, который существует вфайл.

У меня есть следующий код, чтобы сделать это, но он всегда говорит мне "найдено" для всех имен, которые я ввел в клавиатуру.

sub openFile {

  open(FILE, "/home/server/test2.txt");
  print "file open!\n";
  print "hostname(Example 'imp-p-125'): ";

  my $name = <STDIN>;
  chomp $name;

if (grep{$name} <FILE>){
      print "found\n";
}else{
    print "word not found\n";
}
  close FILE;
}

Я искал варианты дляиспользуйте RegEx с методом STDIN, но я пока ничего не могу найти.

Заранее спасибо.

1 Ответ

0 голосов
/ 13 июня 2018

Вы неправильно поняли, что делает функция grep.Он оценивает выражение (в данном случае $name) для каждого переданного ему элемента, и если true, этот элемент возвращается.Если $name содержит значение, то оно всегда будет истинным, поэтому будет возвращать каждую строку в файле и всегда выводит результат "Найдено".

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

if($somevalue =~ /pattern/)

Вы хотите обработать каждую строку, поэтому вам также понадобится цикл, например while.Если вы пропустите $somevalue, как и многие функции и операторы Perl, по умолчанию будет $_, что и будет использоваться в этом цикле для предоставления каждой строки файла.А поскольку $name может содержать символы, которые считаются специальными в регулярных выражениях, то окружение его \ Q и \ E означает, что оно будет обрабатываться как обычные символы.

my $found=0;
while(<FILE>)
  {
  if( /\Q$name\E/ )
    {
    $found=1;
    }
  }
if($found)
  {
  print "Found\n";
  }
else
  {
  print "word not found\n";
  }

Вы также используетеустаревший метод открытия файла, а также не проверка его открытия.Попробуйте заменить его на

if(open(my $file, "<", "/home/server/test2.txt"))
  {
  # Your code to process the file goes inside here
  close($file);
  }

PS Не забудьте заменить <FILE> на <$file>

...