Использование sed для замены multiline

Какая у вас среда передачи уровня 2? Ethernet? Невозможно иметь кадр Ethernet короче 64 байтов, независимо от того, что он несет.

Таким образом, даже если вы можете послать эхо-запрос ICMP с 0 байтами полезной нагрузки, ваша карта Ethernet заполнит кадр до 64 байтов для передачи.

@Casey показал, что ваш теоретический минимум составляет 28 байтов, но Ethernet добавит 36 байтов заполнения, чтобы довести его до 64 байтов. Меньше - это Runt-пакет, и он слишком короткий.

Почему 64 байта? Это совершенно новый вопрос, связанный со временем передачи бита и обнаружением коллизий, и что Ethernet является доменом CSMA / CD, а не CSMA / CA.

0
21.03.2018, 11:57
4 ответа

Можно использовать sedдиапазоны:

sed '/^ *ssl:/,/^ *[^:]*:/s/enabled: false/enabled: true/' file

Границами диапазона являются/^ *ssl:/(начало раздела ssl )и/^ *[^:]*:/(любой другой раздел ).

s— обычная команда замены.

6
28.01.2020, 02:13

Используйте инструмент, поддерживающий YAML -. Например, в Perl вы можете

perl -MYAML=LoadFile,DumpFile -we '
    $y = LoadFile("file");
    $y->{ssl}{enabled} = "true" if $y->{ssl}{enabled} eq "false";
    DumpFile("file.new", $y);'
4
28.01.2020, 02:13

Вы были рядом, чтобы найти, и вам нужно было только добавить опцию -z, также вы можете сделать ее короче, как показано ниже.

sed -Ez 's/(ssl:\n\s*enabled: )false/\1true/g' infile
0
28.01.2020, 02:13

Извините, но я соглашусь с @choroba и посоветую вам использовать инструмент, способный парсить и писать yaml. Разбор Sed - неправильный путь. у вас может быть другой отступ, несколько непрерывных концовок. Регулярное выражение стало бы слишком сложным, и вам пришлось бы писать свой собственный синтаксический анализатор Yaml.

Вот решение на рубине Что вы можете использовать в оболочке Bash

echo "ssl:
enabled: false
" | bundle exec ruby -e "require 'psych';
 c = Psych.load(STDIN.read); c['ssl']['enabled'] = true;
 puts c.to_yaml" > updated_dest.yml

если вам нужен сценарий оболочки, который принимает два параметра, это также легко

#!/usr/bin/env ruby

require 'psych'
c = Psych.load_file(ARGV.shift)
c['ssl']['enabled'] = true
File.open(ARGV.shift, 'wb+') {|f| f.write(c.to_yaml)}
0
28.01.2020, 02:13

Теги

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