sed '/^<@\([^|]*\)\(.*\)>/!b
s//\\autocite\2{\1}/
s/|/[/;s/|/][/g;/\[/s/{/]{/
' <<\DATA
<@sample>
<@sample|12>
<@sample|12|c.>
DATA
\autocite{sample}
\autocite[12]{sample}
\autocite[12][c.]{sample}
Первое, что делает sed
, это проверяет, что линия, над которой он работает, начинается с <@
, за которой в какой-то момент следует >
. Если линия не совпадает с этим шаблоном, то b
ранчо выходит из скрипта, чтобы начать следующий цикл линии и повторить попытку.
Но если она совпадает с sed
выполняет небольшую двойную задачу, ссылаясь на \1
со всеми или любыми символами, следующими за @
, которые не являются символом |
и ссылаясь на \2
со всеми или любыми символами, следующими за первой последовательностью до последнего появления >
на строке. На следующей строке - которая достигается только в случае совпадения первой строки - sed
заимствует эти ссылки из первого адреса и заменяет всю строку на \\autocite\2{\1}
.
В следующей строке sed
пытается заменить первое появление символа |
символом [
, тогда больше не будет |
символов с ][
, и, наконец, если [
существует на строке, то он заменяет первое появление {
на ]{
.
Все, что делает sed
, просто. Все, что делает sed
, является прямым результатом того, что он только что сделал. sed
очевидно - и иногда раздражающе - упорядочено.
И кстати - это должно обрабатывать столько |
разделенных параметров, сколько можно было бы позаботиться о том, чтобы указать в одной строке - это не ограничивается двумя. Но при этом должны соблюдаться маркеры [<>@|{}]
и расположение строк - по крайней мере, как написано. Пока вы следуете правилам, sed
наверняка ничего не нарушит.
Вы можете запустить ls -rt
через SSH на сервере в каталоге, чтобы узнать последний измененный файл (на основе даты последнего изменения вместо имени файла)
fileToCopy=$(ssh "$host" "cd $remote_path && ls -rt | tail -1")
scp "$host":"$remote_path"/"$fileToCopy" "$local_target_dir"/filename."$host"
Я предлагаю выяснить это, подтверждая вашу дату, и иметь в виду последнюю резервную копию, например:
#!/bin/bash
day=${date +%d}
last_month=${date -d "-1 month" date +%Y-%m-%d}
if [ $day -eq 15]
then
echo "Is 15th, time to make get last backup!"
scp -P port user@server:/dir/servername_BBC-3.0_$last_month* destination
fi