sed/awk удаляет новую строку при совпадении двух шаблонов

Если предположить, что ваш SSD работает быстрее для записи (а не только для чтения), то есть простой способ настроить это с помощью подсистемы RAID Linux. Предположим, вы собираетесь реплицировать / dev / sda1 (HDD) и / dev / sdb1 (SSD):

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 --write-mostly --write-behind=1024 /dev/sda1

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

Если вы хотите использовать существующий том , вы можете преобразовать его в RAID-1 с форматом суперблока 1.0 .

Накопители уже включают собственные проверки целостности, поэтому обычно нет особого смысла устанавливать еще один поверх. Основная проблема с отказом диска - это данные, которые становятся нечитаемыми, а не поврежденные. Я не знаю, какова относительная частота необнаруженных ошибок для SSD и HDD, но я подозреваю, что это примерно то же самое (и, следовательно, не SSD и HDD, а между конкретными устройствами), поэтому нет оснований предполагать, что данные считываются обратно с HDD точнее. Btrfs и ZFS имеют дополнительную проверку целостности на уровне файловой системы, если вы этого хотите.

5
11.07.2016, 20:55
4 ответа

В одну сторону с sed:

sed -e '/^---/ {
  :1
  $!N
  s/\n/ /
  /---$/!b1
}' <file

Этот подход выполняет работу прямо:

  • Если строка начинается с ---, то введите блок кода
  • Внутри кодового блока мы создаем метку цикла с именем 1
  • Мы читаем Next строка входа, если текущая строка не является последней строкой $
  • Замените новую строку n пробелом
  • Если следующая строка делает закончить с ---, сломать ! цикл, в противном случае перезапустите цикл b1
12
27.01.2020, 20:31

Выполнение версии posix в соответствии с запросом в комментарии:

#!/bin/sh
jump=1

while IFS= read -r lin; do

  case $lin in 
    ----*)
        jump=0
    ;;
    *----)
        jump=1
    ;;
  esac

  if [ "$jump" = "1" ]; then 
        printf '%s\n' "$lin" 
  else
        printf '%s' "$lin "
  fi

done <"$1"

Вызвать его:

./script file.txt >thedest.txt 
2
27.01.2020, 20:31

Предположим, что ключевые строки также должны быть собраны в одну длинную строку:

sed '
    :a
    N
    /\n-\|-\n/{
        P
        D
    }
    s/\n/ /
    ta
    ' file
3
27.01.2020, 20:31

Вот еще один sed :

sed '/^---/,/---$/{H;/^---/h;/---$/!d;x;s/\n/ /g;}' infile

он использует диапазон и буфер хранения. Он добавляет каждую строку в этом диапазоне в буфер удержания, перезаписывая ее, если это начало диапазона; он удаляет строку, если это не конец диапазона, иначе он обменивается буферами и заменяет все новые строки пробелами.
И другой подход с ed :

ed -s infile <<\IN
?^---?,.-s/$/ /
?^---?,$j
1,/---$/-s/$/ /
1,/---$/j
w
q
IN

В нем используются четыре диапазона: сначала поиск выполняется в обратном направлении ( ed начинается с конца файла) и добавляет пробел в конец каждой строки в первом диапазоне, а затем соединяет строки во втором диапазоне (которые на самом деле являются строками в первом плюс еще одна строка); затем он делает то же самое, но начиная с начала файла.

3
27.01.2020, 20:31

Теги

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