Замена первым вхождением шаблона в строке, для всех строк в файле с sed

Да, это возможно. rsync также имеет --update, но с ним rsync все еще использует его алгоритм передачи дельты в случае, если src является более новым. rsync обеспечивает --whole-file опция отключить этот алгоритм. Таким образом,

$ rsync --update --whole-file ...

должен иметь эффект, что src файлы только копируются в место назначения, когда они являются более новыми. И только проверки mtime должны использоваться для этого.

Существует несколько причин избежать алгоритма передачи дельты для специальных вариантов использования. Главным образом причины производительности и возможно передают объем в совершенно особых случаях.

Заключить в кавычки из страницы справочника:

- W, - целый файл

При использовании этой опции алгоритм передачи дельты rsync не используется, и целый файл отправляется как есть вместо этого. Передача может быть быстрее, если эта опция используется, когда пропускная способность между источником и целевыми машинами выше, чем пропускная способность к диску (особенно, когда "диск" является на самом деле сетевой файловой системой). Это - значение по умолчанию, когда и источник и место назначения указаны как локальные пути, но только если никакая пишущая пакет опция не в действительности.

Случай о сетевых файловых системах должен быть наиболее распространенным.

Кроме того, так как алгоритм передачи дельты является эвристикой, можно вообразить файлы, где алгоритм заканчивает тем, что передал целый файл и просто добавляет (время и пространство) наверху.

15
09.04.2012, 06:25
2 ответа

Вы сверхдумаете это. sed замены только первая инстанция на строке по умолчанию (без /g модификатор), хотя Вы все еще хотите привязать, потому что Вы надеваете; t так хочу первую инстанцию в строке как та в начале строки; и Вам обычно не нужны явные действия строки, которые Вы пытаетесь использовать (почему?).

sed 's/^" /"/'
32
27.01.2020, 19:49
  • 1
    Спасибо! я думал, что это было необходимо явно объявить действия строки при работе над файлом, читать об этом и просто продолжило использовать их. Я действительно сверхдумал это, который не мог быть более простым, и это добивается цели :) –  Steve B. 09.04.2012, 06:33
  • 2
    я испытываю желание сказать те команды, является в значительной степени устаревшим; возможно сделать довольно сложные многострочные вещи с ними, но не легко сделать так, и в эти дни Вы - действительно более обеспеченное использование perl/python/ruby/whatever вместо этого. сценарий –  geekosaur 09.04.2012, 06:40
  • 3
    Полностью не согласитесь с вышеупомянутым комментарием; мультилиния sed команды такой как N и маркировки такой как :a не являются устаревшими вообще, и они являются портативными и указанный POSIX, в отличие от Perl/Python/Ruby/whatever. Это верно однако, что при нахождении их часто необходимо учиться awk. –  Wildcard 11.04.2016, 22:16

Более общий ответ, так как я не могу комментировать ответ гекозавра. -Вы бы не поставили якорь ^ (начало строки ). Например, если вы хотите заменить первое вхождение A на B, у вас будет

sed 's/A/B/'
3
27.01.2020, 19:49

Теги

Похожие вопросы