Замена текста в большом файле с помощью sed

Глядя на ранее -заданный вопрос "Каково минимальное значение SO _RCVBUF?" и это руководство по сетевому программированию , ваши подозрения кажутся правильными. UDP- и IP-пакеты будут молча отбрасываться, потому что для хранения пакета будет недостаточно места, и (насколько я понимаю, )TCP-соединения не будут работать, потому что минимальный размер окна передачи будет больше, чем размер буфера; в любом случае вы ничего не получите.

Почему минимальный размер буфера сокета такой маленький, это, вероятно, исторический артефакт в документации. Глядя на исходный код Linux v4.0 (linux/include/net/sock.h ), оказывается, что фактический минимальный размер немного больше (2048+выровненный размер sk_buff )и был в течение достаточно долгого времени .Мое предположение, почему задокументированный минимум такой низкий, заключается в том, чтобы разрешить необработанный доступ к пакетам ячеек ATM, которые были 48 -53 байта , но это всего лишь предположение.

1
13.09.2019, 09:29
1 ответ
  1. Регулярное выражение проверено — сложное утверждение, так как существуют не только базовые и расширенные регулярные выражения, но и ряд нестандартных -разновидностей, некоторые из которых вы используете.

  2. Вы используете расширенные регулярные выражения, вам нужно сообщить об этом вашему sedс опцией-E

  3. Вы ищете разрывы строк (возврат каретки, перевод строки )в своем шаблоне, но sedобрабатывает ввод построчно, поэтому это никогда не совпадет, если вы не соедините строки. Однако,похоже, вы используете GNU sed, поэтому у вас есть опция -zдля обработки всех строк одновременно. Это работает для примера, но может не работать с большими файлами.

  4. В зависимости от вашей оболочки вам может потребоваться использовать одинарные кавычки вместо двойных для защиты скрипта.

    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.

1
27.01.2020, 23:40

Теги

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