Я не уверен, что это применимо к вашему случаю, но если вы хотите, чтобы все сценарии в каталоге выполнялись с использованием sudo определенным пользователем, вы можете использовать следующую конструкцию:
username ALL=(ALL) NOPASSWD: /some/ungodly/long/directory/name/
обратите внимание на завершающий /
, который подразумевает все файлы в каталог, разрешенный sudo.
Даже если это не ваш случай, вы все равно можете делать копии своих скриптов в блоке псевдонимов команды sudoers, перемещать их в другой каталог и использовать указанную выше конструкцию.
Вы можете обрабатывать ввод построчно с помощью sed
и объединять многострочные сопоставление с шаблоном:
/pat1/ { N; N; ...; /pat2\npat3\n.../q }
Таким образом, в вашем примере это будет, например:
sed -n '/^dove$/ { N; N; /\nbird\nbunny$/q; }; p' infile
Вывод:
cat
dog
fox
cow
Вот альтернативный подход 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
Вот небольшой лайфхак для 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`