Как счетчик следующей строки обновляется в sed? - PullRequest
2 голосов
/ 24 апреля 2019

Я не могу понять, как sed читает следующую строку.

Он - мое понимание, и, пожалуйста, поправьте меня, где я ошибаюсь

/pattern/p, так что это читает построчно ипечатает, если строка соответствует

N;/pattern/d, поэтому это читает две строки вместе, и если шаблон существует, то удаляет обе, и в следующем цикле sed начинает чтение со строки 2 или строки 3, и строка уже была прочитана N?

:a N; /pattern/{:b;n;/pattern/bb; ba}

Теперь в вышеприведенном случае внутренний цикл.n прочитайте следующую строку несколько раз, а затем вернитесь к.Теперь мой вопрос: когда управление вернется к тому, что будет читать N

пример

Это пример файла

line 11
line 13
line 13
line 13
line 14
line 15
line 16

Первоначально N будет содержать.line 11 \n line 13 если шаблон равен 13, то во внутреннем цикле n снова читает следующую строку и возвращается, пока 13 не будет, а затем вернитесь к a

Теперь мои вопросы: что будетзначение N?это будет

line 14 \n line line 15.или line 14 \n line 13

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019
:a N; /pattern/{:b;n;/pattern/bb; ba}

Давайте сделаем его более читабельным и добавим комментарии:

# At the start there is one line read from input
# read into pattern space

# define label with the name 'a'
:a

# append next line to pattern space
N

# Match pattern space with 'pattern'
/pattern/{
   # go here if matching successfull

   # define label 'b'
   :b

   # read the next line into pattern space
   # current pattern space is removed
   n

   # match pattern space with /pattern/
   /pattern/{

      # goto label 'b'
      bb
   }

   # goto label 'a'
   ba

}

в следующем цикле sed начинает чтение со строки 2 или строки 3, и строка уже была прочитана N?

Вы не можете вернуться к вводу.На входе есть строки.N добавляет следующую строку из ввода в шаблонное пространство.Как только ввод прочитан, вы не можете перечитать его.d удаляет пространство шаблона и запускает цикл (т. Е. Работает вроде n; b<label on the beginning>).

У меня вопрос: когда управление вернется к тому, что N будет читать

Он перейдет к :a, когда шаблон больше не будет соответствовать.

   not
   pattern # jumps into /pattern/{ .. }
   pattern # jumps into inside /pattern/bb
   pattern
   pattern
   not # get's back to :a

мои вопросы, какое значение будет N?

N не имеет значения, это команда, которая добавляет следующую строку из ввода в пространство образца.

Содержимое пространства образца после команды N будет содержать две строки.В приведенном вами примере сначала будет line 11\nline13, затем line14\nline15.Это легко увидеть с помощью простого скрипта:

sed -n ':a N; p; /13/{:b;n;/13/bb; ba}' <<EOF
line 11
line 13
line 13
line 13
line 14
line 15
line 16
EOF

Все объяснения команд можно найти в man sed . Это - очень хорошее введение в sed.

2 голосов
/ 24 апреля 2019

Все это поведение можно наблюдать с помощью отладчика GNU, --debug.

▶ data="line 11
line 13      
line 13     
line 13                  
line 14         
line 15     
line 16"     

Вывод:

▶ gsed ':a N; /13/{:b;n;/13/bb; ba}' <<< $data                 
line 11
line 13
line 13
line 13
line 14
line 15
line 16

Просмотр вывода в отладчике:

▶ gsed --debug ':a N; /13/{:b; n; /13/bb; ba}' <<< $data
SED PROGRAM:
  :a
  N
  /13/ {
    :b
    n
    /13/ b b
    b a
  }
INPUT:   'STDIN' line 1
PATTERN: line 11
COMMAND: :a
COMMAND: N
PATTERN: line 11\nline 13
COMMAND: /13/ {
COMMAND:   :b
COMMAND:   n
line 11
line 13
PATTERN: line 13
COMMAND:   /13/ b b
COMMAND:   :b
COMMAND:   n
line 13
PATTERN: line 13
COMMAND:   /13/ b b
COMMAND:   :b
COMMAND:   n
line 13
PATTERN: line 14
COMMAND:   /13/ b b
COMMAND:   b a
COMMAND:   :a
COMMAND:   N
PATTERN: line 14\nline 15
COMMAND:   /13/ {
COMMAND:   }
END-OF-CYCLE:
line 14
line 15
INPUT:   'STDIN' line 7
PATTERN: line 16
COMMAND:   :a
COMMAND:   N
END-OF-CYCLE:
line 16

Теперь мой вопрос: когда управление вернется к a, что будет читать N

Как вы можете видеть:

PATTERN: line 14
COMMAND:   /13/ b b
COMMAND:   b a
COMMAND:   :a
COMMAND:   N
PATTERN: line 14\nline 15

Итак, командасразу после ba равно :a, а затем N, и N дает эффект чтения следующей строки входного потока и добавления его в пространство образца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...