Следующий сценарий Python делает желаемую фильтрацию.
#!/usr/bin/python
import re
# Bibliography entries to retrieve
# Multiple pattern compilation from: http://stackoverflow.com/a/11693340/147021
pattern_strings = ['Author2010', 'Author2012',]
pattern_string = '|'.join(pattern_strings)
patterns = re.compile(pattern_string)
with open('bibliography.bib', 'r') as bib_file:
keep_printing = False
for line in bib_file:
if patterns.findall(line):
# Beginning of an entry
keep_printing = True
if line.strip() == '}':
if keep_printing:
print line
# End of an entry -- should be the one which began earlier
keep_printing = False
if keep_printing:
# The intermediate lines
print line,
Лично, я предпочитаю перемещаться в язык сценариев, когда логика фильтрации становится сложной. Это, возможно, имеет преимущество на факторе удобочитаемости, по крайней мере.
Оболочки отслеживают символические ссылки в качестве удобства для пользователей. Это имеет приятный эффект, который CD Foo && CD.
Всегда возвращается в исходный каталог, даже когда foo
- это символическая ссылка на каталог. Он имеет два вида потенциалов: главное - это то, что другие программы не ведут себя таким образом; Кроме того, символическое отслеживание каталога вводит свои собственные проблемы (что происходит, когда символическая ссылка меняется? Что произойдет, если этот процесс не имеет разрешения на чтение SymLink? и т. Д.).
Оболочки могут сделать это только потому, что они отслеживают все изменения каталога, поэтому они помнят, как у вас там. Когда начинается новый процесс, он не получает эту историческую информацию. Под капотом он находит, где он движется вверх из текущего каталога, следуя ..
Ссылки, пока он не попадает в root¹.
Если вы достигли каталога через символические ссылки, вы можете распечатать путь Man-SymLink с помощью встроенного PWD
, вызывая PWD -P
. Если вы вызываете другую программу из оболочки, не передавайте ее путь, который содержит ..
После компонентов SymLink, поскольку программа будет интерпретировать ее по-разному. Вместо этого устраняют компоненты ..
.. .. . . . . . компоненты, вызывая PWD -P
:
cp "$(cd .. && pwd -P && echo /)test-parent.txt" .
Если вы хотите забыть о SymLinks, используемых в прошлом CD CD
в сеансе оболочки , Вы можете запустить
cd "$(pwd -P && echo /.)"
. Это изменение в том, что уже является текущим каталогом, поэтому он не изменяет текущий каталог процесса оболочки, но он меняет путь, который оболочка отслеживается для текущего каталога, что делает его SymLink Отказ
¹ Так как работает getcwd
. Некоторые ядра отслеживают текущий каталог, но не отслеживают символические ссылки, для обратной совместимости, если для какой-либо другой причины (но также из-за тонких краевых случаев с символическими ссылками).
Это связано с тем, что CP
не играет ту же ссылку Игра Ваша оболочка. Ваша оболочка отслеживает ссылки с текущим рабочим каталогами в качестве подражания к текущему рабочему каталогу, но ядро не хочет никакой из этой ерунды, когда оболочка идет на вызов CP
- скорее ядро будет Сделайте CP
текущий рабочий каталог полностью квалифицированный абсолютный путь - и так его .
Ссылки и ваша оболочка .
Ссылки не одинаковы .
.
Вы можете обеспечить абсолютный путь к текущему рабочему каталогу так же легко, как CD-P.
И то же самое будет работать для любого другого каталога, такого как CD-P - / Any A / другой / каталог
. Не менее используют PWD
, чтобы распечатать абсолютный путь к .
Как PWD -P
, а во многих снарядах он будет изменен $ pwd
на абсолютный путь (одинаково CD-P.
делает) .
Например:
cd /tmp
mkdir -p parent child
cd parent
ln -s ../child child
touch ./child/somefile
cd -L child ###the default
printf %s\\n "$PWD"/*
cd -P .
printf %s\\n "$PWD"/*
/tmp/parent/child/somefile
/tmp/child/somefile