Регулярное выражение проверено — сложное утверждение, так как существуют не только базовые и расширенные регулярные выражения, но и ряд нестандартных -разновидностей, некоторые из которых вы используете.
Вы используете расширенные регулярные выражения, вам нужно сообщить об этом вашему sed
с опцией-E
Вы ищете разрывы строк (возврат каретки, перевод строки )в своем шаблоне, но sed
обрабатывает ввод построчно, поэтому это никогда не совпадет, если вы не соедините строки. Однако,похоже, вы используете GNU sed
, поэтому у вас есть опция -z
для обработки всех строк одновременно. Это работает для примера, но может не работать с большими файлами.
В зависимости от вашей оболочки вам может потребоваться использовать одинарные кавычки вместо двойных для защиты скрипта.
sed -zEi '/,[\r\n]+ ОГРАНИЧЕНИЕ [a-zA-Z0-9_]+
ВНЕШНИЙ КЛЮЧ([a-zA-Z0-9_]+
)ССЫЛКИ[a-zA-Z0-9_]+
([a-zA-Z0-9_]+
)/ s// /g' все _файлы _test.sql
уже выполняет замену, которую вы ожидаете в zsh
, возможно, также и в вашем cmd.exe
. Все-таки адрес строки — это ерунда со всеми строками в одном буфере, так что
sed -zEi 's/,[\r\n]+ CONSTRAINT `[a-zA-Z0-9_]+` FOREIGN KEY \(`[a-zA-Z0-9_]+`\) REFERENCES `[a-zA-Z0-9_]+` \(`[a-zA-Z0-9_]+`\)/ /g' all_files_test.sql
более логичен (результат остается тем же ). Наконец, вы не объясняете, как вы ожидаете, что строки KEY `holding
исчезнут.
Но теперь к стандартному способу выполнения многострочной -подстановки, шаблону N;P;D
, который также должен работать для больших файлов:
sed -Ei 'N;/,*[\r\n]+ CONSTRAINT `[a-zA-Z0-9_]+` FOREIGN KEY \(`[a-zA-Z0-9_]+`\) REFERENCES `[a-zA-Z0-9_]+` \(`[a-zA-Z0-9_]+`\)/{s// /g;s/^/\n/;D;};P;D' all_files_test.sql
N
всегда добавляет следующую строку, поэтому ваш шаблон может совпадать. P
печатает первую строку буфера, а D
удаляет эту первую строку и начинает с остальных. Таким образом, с N;P;D
у вас всегда есть пара строк в пространстве шаблонов.
Однако, если мы заменили, у нас есть только одна строка, но мы хотим продолжить со следующей, поэтому хитрость заключается в том, чтобы вставить пустую строку в начало шаблона только сs/^/\n/
(GNU sed
! ), чтобы быть удаленным D
.
Добавьте префикс ./
к относительному пути (имени файла ), и он больше не будет начинаться с дефиса
rsync -av./-items* destination:destPath/
Или удалите подстановочный знак *
и перенесите родительский каталог
rsync -av./ destination:destPath/dir
Вы делаете это так же, как и с большинством инструментов:
Вы пишете путь так, чтобы он не начинался с тире, возможно, явно записывая ./
или используя абсолютный путь к каталогу.
rsync...options... /full/path/src./dst
Вы используете --
, чтобы остановить синтаксический анализ опции перед операндами пути:
rsync...options... -- srcpath dstpath
В вашем случае при использовании --
следующее создаст /some/other/path/--Archives-
как копию каталога --Archives-
в текущем каталоге:
rsync -av -- --Archives- /some/other/path
Следующее будет копировать только содержимое --Archives-
в каталог назначения:
rsync -av -- --Archives-/ /some/other/path
Важна косая черта в конце исходного пути. Косая черта в конце пути назначения не имеет значения.
Обратите внимание, что редко требуется использовать явное подстановочное значение для исходного пути (s ), если только вы не знаете, что хотите избежать копирования любых скрытых имен из самого верхнего -самого источника пути.
Использование -e
в примере команды не требуется, если только вам не нужно вызывать ssh
особым образом для создания сетевого подключения к вашему источнику или получателю. В примере кода в вопросе вы, кажется, добавляете к исходному пути префикс -e
, что, вероятно, является ошибкой (, и вы упоминаете копирование между двумя дисками , что не требует подключения по сети. вообще ).
Кроме того, обратите внимание, что использование-z
(сжатия )вряд ли ускорит работу, если только у вас не очень медленное сетевое соединение (, т. е. если вы можете сжимать и распаковывать гораздо быстрее, чем то, что вы можете передавать ). Поэтому нет необходимости использовать -z
при локальном копировании. На самом деле, это может замедлить работу.