$ sed '/abstract =.*},$/d; /abstract = /,/},$/d' <file
@article{ginsberg_lifespan_2018,
title = {On the lifespan of three-dimensional abstract gravity water waves with vorticity},
language = {en},
urldate = {2018-12-05},
author = {Ginsberg, Daniel},
month = dec,
year = {2018}
}
@article{higaki_two-dimensional_2017,
title = {On the two-dimensional steady {Navier}-{Stokes} equations related to flows around a rotating obstacle},
journal = {arXiv:1703.07372 [math]},
author = {Higaki, Mitsuo and Maekawa, Yasunori and Nakahara, Yuu},
month = mar,
year = {2017},
note = {arXiv: 1703.07372},
keywords = {Mathematics - Analysis of PDEs}
}
Это сначала пытается удалить запись из одной строки abstract
, а если это не работает, пытается удалить запись из нескольких строк -abstract
. Многострочная запись -— это набор строк от строки, содержащей abstract =
, до следующей строки, заканчивающейся на },
.
Аннотированный sed
сценарий:
/abstract =.*},$/d # delete complete abstract line, skip to next input line
/abstract = /,/},$/d # delete multi-line abstract entry
Если вам нужно уточнить начальную строку, вы можете использовать, например, ^[[:blank:]]*abstract
вместо бита abstract
в этих выражениях. Это позволит использовать только пробелы или символы табуляции перед abstract =
в этих строках.
Используя rsync и фильтрацию (-f )вы можете фильтровать каталоги и отфильтровывать все остальное, вот так:
rsync -av -f "+ */" -f "- *" src_dir/ new_dir/
Вы можете изменить ;
на +
для find... -exec
, уменьшив количество вызовов процесса. В этой ситуации вам нужно использовать небольшую часть оболочки, чтобы развернуть список каталогов, которые будут переданы в:
find src_dir -type d -exec bash -c 'echo cd "$0" && echo mkdir -p "$@"' dest_dir {} +
Удалите два экземпляра echo
, если вы уверены, что все работает должным образом. (Обратите внимание, что вы получите dest_dir/src_dir/...
; если вы этого не хотите, используйте этот тип конструкции, не забывая убедиться, что dest_dir
переписан как абсолютный путь):
cd src_dir && find -type d...