Как работает команда sed: "sed -e: a -e '$ d; N; 2,10ba' -e 'P; D'" работает? - PullRequest
0 голосов
/ 13 апреля 2019

Я увидел команду sed для удаления последних 10 строк данных:

 sed -e :a -e '$d;N;2,10ba' -e 'P;D'

Но я не понимаю, как это работает. Может кто-нибудь объяснить это для меня?

UPDATE:

Вот мое понимание этой команды:

  1. Первый скрипт указывает, что метка «a» определена.
  2. Второй сценарий указывает, что он сначала определяет, является ли строка, читающая пробел в данный момент, является последней строкой. Если это, выполните команду "d", чтобы удалить ее и перезапустить следующий цикл; если нет, пропустите команду "d"; затем выполните команду "N": добавьте новую строка из входного файла в пространство шаблона, а затем выполнить «2,10ba»: если строка, читающая пробел в данный момент, является строкой в строках со 2 по 10 перейдите к метке "a".
  3. Третий сценарий указывает, что если строка в настоящее время читается в Пространство шаблона не является строкой от строки 2 до строки 10, сначала выполните команду «P»: первая строка в шаблонном пространстве печатается, а затем выполняется команда "D": первая строка в шаблоне пространство удалено.

Мое понимание "$d" состоит в том, что "d" будет выполнено, когда sed прочитает последнюю строку в шаблонном пространстве . Но кажется, что каждый раз, когда выполняется «ba», будет выполняться «d», независимо от того, является ли текущая строка, прочитанная в шаблонном пространстве , последней строкой. почему?

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

:a это метка. $ в адресе означает последнюю строку, d означает delete . N обозначает и добавляет следующую строку в пространство шаблона . 2,10 означает строки от 2 до 10, b означает ответвление (то есть goto ), P печатает первую строку из пространства шаблона, D похоже на d но работает на пространстве шаблона, если это возможно.

Другими словами, вы создаете скользящее окно размером 10. Каждая строка сохраняется в нем, и как только у него есть 10 строк, строки начинают печататься сверху. Каждый раз, когда строка печатается, текущая строка сохраняется в скользящем окне внизу. Когда печатается последняя строка, скользящее окно удаляется, что удаляет последние 10 строк.

Вы можете изменить команды, чтобы увидеть, что удаляется (()), сохраняется (<>) и печатается с помощью P ([]):

$ printf '%s\n'  {1..20} | \
    sed -e ':a ${s/^/(/;s/$/)/;p;d};s/^/</;s/$/>/;N;2,10ba;s/^/[/;s/$/]/;P;D'
[<<<<<<<<<<1>
[<2>
[<3>
[<4>
[<5>
[<6>
[<7>
[<8>
[<9>
[<10>
(11]>
12]>
13]>
14]>
15]>
16]>
17]>
18]>
19]>
20])
0 голосов
/ 14 апреля 2019

более простой способ, если ваши данные в файле 'd' по gnu sed,

sed -Ez 's/(.*\n)(.*\n){10}$/\1/' d

                         ^

указал 10 - это номер последней строки для удаления

просто переместите группу фигурных скобокинвертировать, т.е.получить только последние 10 строк

sed -Ez 's/.*\n((.*\n){10})$/\1/' d
...