Это довольно старый, но принятый ответ слишком строг. -Несколько файлов не обязательно являются одним аргументом для rsync. Изman rsync
:
ADVANCED USAGE
The syntax for requesting multiple files from a remote host is done by specifying additional remote-host args in the same style as the first, or with the hostname omitted. For
instance, all these work:
rsync -av host:file1 :file2 host:file{3,4} /dest/
rsync -av host::modname/file{1,2} host::modname/file3 /dest/
rsync -av host::modname/file1 ::modname/file{3,4}
поэтому команда OP будет
rsync -Pav -e 'ssh -i sshkey' user@remotemachine:/home/user/file1.zip :/home/user/file2.zip :/home/user/file3.zip .
Это невозможно для более старых версий rsync, но я думаю, что все основные дистрибутивы поддерживают это уже несколько лет.
Предполагая, что вы ищете строку до .foo()
, вы можете попробовать:
sed 's/^.*\W\(\w*\)\.foo().*$/\1/g'
\w
является синонимом[_[:alnum:]]
\W
является синонимом[^_[:alnum:]]
Итак, мы ищем часть перед .foo()
, состоящую только из символов alphanumeric
и _
и предшествующую символу non-alphanumeric
. Заменяем всю строку только этой частью.
Если some_function_name.foo()
встречается дважды в одной и той же строке, будет обнаружен только первый экземпляр.
Если вы хотите убедиться, что все этих паттернов пойманы, даже если они встречаются дважды в одной строке, вы можете использовать:
grep -Po '\w*(?=\.foo\(\))'
из man grep:
-P, --perl-regexp
Interpret the pattern as a Perl-compatible regular expression (PCRE). This is experimental and grep -P may warn of unimplemented features.
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.
Часть (?=\.foo\(\))
называется Lookahead
, что позволяет удалить часть совпадающего текста из шаблона. Так что в этом случае это будет из .foo()
из шаблона.