Многострочное регулярное выражение (grep, sed, awk, perl)

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

Синтаксис используется следующий

sshfs remote_user@remote_computer:/full/path/to/directory /path/to/local/directory
3
23.02.2017, 08:27
3 ответа

Вы можете сделать это с помощью Awk, установив для переменной «Разделитель записей» регулярное выражение, соответствующее как минимум двум последовательным символам новой строки:

awk -v RS='\n\n+' '/1.*2.*3/' file.txt

Вы также можете установите «Разделитель полей» на один символ новой строки:

awk -v RS='\n\n+' -F '\n' '$1 == "LINE OF TEXT 1" && $2 == "LINE OF TEXT 2" && $3 == "LINE OF TEXT 3"' file.txt

Разбито для удобства чтения:

awk -v RS='\n\n+' -F '\n' '
  $1 == "LINE OF TEXT 1" &&
  $2 == "LINE OF TEXT 2" &&
  $3 == "LINE OF TEXT 3"
' file.txt

С вашим требованием печатать имя файла только при обнаружении совпадения, вы можете сделать это следующим образом:

awk -v RS='\n\n+' -F '\n' '
  $1 == "LINE OF TEXT 1" &&
  $2 == "LINE OF TEXT 2" &&
  $3 == "LINE OF TEXT 3" {
    match++
  }
  END {
    if (match) {
      print FILENAME
    }
' file.txt

Но учитывая вы говорите о с использованием find в сочетании с awk , я бы рекомендовал просто использовать Awk для статуса выхода и использовать find для печати:

find . -type f -exec awk -v RS='\n\n+' -F '\n' '
  $1 ~ /LINE OF TEXT 1/ &&
  $2 ~ /LINE OF TEXT 2/ &&
  $3 ~ /LINE OF TEXT 3/ {
    exit 0
  }
  END { exit 1 }
' {} \; -print

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

3
27.01.2020, 21:25

Вы можете сделать это, используя дуэт find <-> perl, работающий в тандеме, например:

find . -type f -exec \
  perl -l -0777ne '/^LINE.* 1\nLINE.* 2\nLINE.* 3$/m && print $ARGV' {} +
0
27.01.2020, 21:25

Вы можете использовать «режим абзаца» в Perl, он будет читать файл по блокам разделены несколькими символами новой строки. Просто установите пустую строку в качестве разделителя входных записей $ / :

perl -lne 'BEGIN { $/ = "" }
       $found = 1 if /^LINE.* 1\nLINE.* 2\nLINE.* 3$/m;
       if (eof) { print $ARGV if $found; undef $found }
' -- file1 file2...
  • eof истинно в конце каждого файла
  • $ ARGV - это имя текущего открытого файла.
1
27.01.2020, 21:25

Теги

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