Regex: соответствуйте 2-му и 3-му символу

Мы не должны забывать, что сущность задачи действительно довольно проста; как вставлено учебное руководство на Haskell (то, которое записано вокруг работы через решения для этой задачи, инкрементно совершенствовало),

Теперь давайте думать на мгновение о том, как наша программа будет управлять и выражать это в псевдокоде:

main = Read list of directories and their sizes.
       Decide how to fit them on CD-Rs.
       Print solution.

Разумные звуки? Я думал так.

Давайте упростим нашу жизнь немного и предположим на данный момент, что мы вычислим размеры каталога где-нибудь вне нашей программы (например, с"du -sb *"), и читают эту информацию из stdin.

(от Автостопщиков ведут Haskell, Главе 1),

(Additionaly, в Вашем вопросе, требуется смочь настроить (редактируют) получающиеся структуры диска и затем используют инструмент для записи их.)

Вы могли снова использовать (адаптируйтесь и повторное использование), простой вариант программы, от что учебное руководство Haskell для разделения Вашего набора файла.

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

Чтобы помочь Вам некоторые использовать его код, вот, выборка из кода удара distributeстроке 380), который служит, чтобы сделать эту "существенную" задачу разделения набора файлов:

# Splitting:

function splitMirrorDir() {
  if [[ ! -d "$THIS_BASES_DIR/$BASE/$type" ]]; then
    echo $"No base fixed for $type" >&2
    exit 1
  fi

  # Getting the list of all suitable files:
  local -a allFiles
  let 'no = 0' ||:
  allFiles=()
  # no points to the next free position in allFiles
  # allFiles contains the constructed list
  for p in "$THIS_BASES_DIR/$BASE/$type"/*.rpm; do
      if [[ ! -e "$p" ]]; then
      # fail on non-existent files
      echo $"Package file doesn't exist: " "$p" >&2
      return 1 
      fi
      if [[ "$ONLY_REAL_FILES" == "yes" && ! -f "$p" ]]; then
      continue
      fi
      if [[ "$DIFF_TO_BASE" ]]; then
          older_copy="$DIFF_TO_BASE/$type/${p##*/}" # using shell param expansion instead of `basename' to speed up
          if [[ -h "$older_copy" || -a "$older_copy" ]]; then
          continue
      fi
      fi
      allFiles[$(( no++ ))]="$p"
  done
  readonly -a allFiles

  # Splitting the list of all files into future disks:
  # 
  local -a filesToEat allSizes
  let 'no = 0' ||:
  filesToEat=()
  allSizes=($(getSize "${allFiles[@]}"))
  readonly -a allSizes
  # allSizes contains the sizes corrsponding to allFiles
  # filesToEat hold the constructed list of files to put on the current disk
  # no points to the next free position in filesToEat
  # totalSize should hold the sum of the sizes 
  #  of the files already put into filesToEat;
  #  it is set and reset externally.
  for p in "${allFiles[@]}"; do 
      if (( totalsize + ${allSizes[$(( no ))]} > CDVOLUME )); then
      eatFiles "${filesToEat[@]}"
          filesToEat=()
          finishCD
      startTypedCD
    fi
      let "totalsize += ${allSizes[$(( no ))]}" ||:
      filesToEat[$(( no++ ))]="$p"
  done
  eatFiles "${filesToEat[@]}"
}

function eatFiles() {
    #{ oldIFS="$IFS"; IFS=$'\n'; echo "$FUNCNAME: args: " "$*" | head >&2;  IFS="$oldIFS"; }
    zeroDelimited "$@" | xargs -0 --no-run-if-empty \
    cp -s \
    --target-dir="$THIS_LAYOUTS_DIR/cd$(( cdN ))/$PREFIX/$type$DOT_SUFFIX"/ \
    --
}

function startTypedCD() {
#  set -x
  mkdir -p "$THIS_LAYOUTS_DIR/cd$(( cdN ))/$PREFIX/$type$DOT_SUFFIX"
  start_action $" %s with %s" "$(( cdN ))" "$type"
#  set +x
}

function finishCD() {

(читайте больше после строки 454),

Обратите внимание что eatFiles функция готовит разметки будущих дисков как деревья, где листы являются символьными ссылками на реальные файлы. Так, это отвечает Вашему требованию, что необходимо смочь отредактировать разметки перед записью. mkisofs утилита имеет опцию следовать за символьными ссылками, который действительно используется в коде моего mkiso функция.

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

"Автостопщики ведут Haskell", относится к проблеме оптимизации больше серьезно и предлагает варианты программы, которые попытались бы перестроить файлы энергично для них, чтобы соответствовать лучше на дисках (и потребовать меньшего количества дисков):

Достаточно предварительных выборов уже. давайте пойдем, упаковывают некоторые CD.

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

давайте начнем с жадного решения...

(читайте больше в Главе 3 и далее.)

Другие умные инструменты

Мне сказали также, что Debian использует инструмент для создания его CD дистрибутива, который более умен, чем мой distribute наборы w.r.t. пакетов: его результаты более хороши, потому что это заботится о зависимостях межпакета и попыталось бы сделать набор пакетов, который входит в первый диск, закрытый под зависимостями, т.е. никакой пакет от 1-го диска не должен требовать пакета от другого диска (или по крайней мере, я сказал бы, количество таких зависимостей должно быть минимизировано).

2
08.08.2011, 13:33
2 ответа

Вам будут нужны обратные ссылки для первой части:

egrep '^.(.)\1'

.{2} просто соответствия любые два символа.

Если Вы хотите 2-е и 4-е символы то же, это - та же идея как выше:

egrep '^.(.).\1'
3
27.01.2020, 21:57

Используйте обратные ссылки. Ответ на Ваш первый вопрос (2-й, 3-й символ то же):

egrep '^.(.)\1'

http://www.regular-expressions.info/brackets.html является простым введением к обратным ссылкам.

2
27.01.2020, 21:57

Теги

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