отображать содержимое файла от начала до многострочного шаблона

Я не уверен, что это применимо к вашему случаю, но если вы хотите, чтобы все сценарии в каталоге выполнялись с использованием sudo определенным пользователем, вы можете использовать следующую конструкцию:

username ALL=(ALL) NOPASSWD: /some/ungodly/long/directory/name/

обратите внимание на завершающий / , который подразумевает все файлы в каталог, разрешенный sudo.

Даже если это не ваш случай, вы все равно можете делать копии своих скриптов в блоке псевдонимов команды sudoers, перемещать их в другой каталог и использовать указанную выше конструкцию.

4
21.06.2017, 21:23
3 ответа

Вы можете обрабатывать ввод построчно с помощью sedи объединять многострочные сопоставление с шаблоном:

/pat1/ { N; N; ...; /pat2\npat3\n.../q }

Таким образом, в вашем примере это будет, например:

sed -n '/^dove$/ { N; N; /\nbird\nbunny$/q; }; p' infile

Вывод:

cat
dog
fox
cow
1
27.01.2020, 20:59

Вот альтернативный подход sed, который использует переход к поддерживать 3-строчный буфер в пространстве шаблонов и проверять его на многострочный шаблон, выходя при обнаружении:

sed -n '
  :a
  $q
  N
  /dove\nbird\nbunny/q
  3,$ {
    P
    D
  }
  ba
' file

С помощью GNU sed вы можете использовать команду Qдля выхода без печати текущего пространства шаблонов, плюс он допускает более свободный синтаксис, например

sed -e :a -e '$Q' -e 'N;/dove\nbird\nbunny/Q' -e '3,${P;D}' -e 'ba' file

или

sed ':a; $Q; N; /dove\nbird\nbunny/Q; 3,${P;D}; ba' file
1
27.01.2020, 20:59

Вот небольшой лайфхак для Python.

Код:

# !/usr/bin/python
import sys
with open(sys.argv[2], 'rU') as f:
    patterns = f.readlines()

result = None
with open(sys.argv[3], 'rU') as f:
    last_match = 0
    for i, line in enumerate(f):
        if line != patterns[last_match]:
            last_match = 0
        else:
            last_match += 1
            if last_match == len(patterns):
                result = i + 1 - len(patterns)
                break

if result != None:
    if sys.argv[1] == 'tail':
        print("tail -n+%d %s" % (result+1, sys.argv[3]))
    else:
        print("head -n%d %s" % (result, sys.argv[3]))

Запустить

Для вывода до шаблона:

`python split_on_pattern.py head pattern_file data_file`

Для вывода из шаблона по:

`python split_on_pattern.py tail pattern_file data_file`
0
27.01.2020, 20:59

Теги

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