Учебники

Редактор потока – Управление шаблонами

Мы уже обсуждали использование шаблона и буфера хранения. В этой главе мы собираемся узнать больше об их использовании. Давайте обсудим команду n, которая печатает пространство шаблона. Он будет использоваться вместе с другими командами. Ниже приведен синтаксис команды n .

 [Адрес1 [, адрес2]] п

Давайте возьмем пример.

[jerry]$ sed 'n' books.txt 

Когда приведенный выше код будет выполнен, он даст следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864 

Команда n печатает содержимое буфера шаблонов, очищает буфер шаблонов, извлекает следующую строку в буфер шаблонов и применяет к нему команды.

Давайте рассмотрим три команды SED до n и две команды SED после n следующим образом:

 Сед команда № 1 
 Sed команда № 2 
 Сед команда № 3 
 п команда 
 Сед команда № 4 
 Sed команда № 5

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

В буфере удержания хранятся данные, но команды SED нельзя применить непосредственно к буферу удержания. Следовательно, нам нужно перенести данные буфера хранения в буфер паттернов. SED предоставляет команду x для обмена содержимым паттернов и хранения буферов. Следующие команды иллюстрируют команду x .

Давайте немного изменим файл books.txt. Скажем, файл содержит названия книг, за которыми следуют имена авторов. После модификации файл должен выглядеть так:

[jerry]$ cat books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 Буря мечей 
 Джордж Р. Р. Мартин 
 Две башни 
 JRR Толкин 
 Алхимик 
 Пауло Коэльо 
 Братство кольца 
 JRR Толкин 
 Паломничество 
 Пауло Коэльо 
 Игра престолов 
 Джордж Р. Р. Мартин 

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

[jerry]$ sed -n 'x;n;p' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 Джордж Р. Р. Мартин 
 JRR Толкин 
 Пауло Коэльо 
 JRR Толкин 
 Пауло Коэльо 
 Джордж Р. Р. Мартин 

Давайте разберемся, как работает эта команда.

  • Первоначально SED считывает первую строку, т. Е. A Storm of Swords, в буфер шаблонов.

  • Команда x перемещает эту строку в буфер удержания.

  • n извлекает следующую строку, т. е. Джордж Р. Р. Мартин, в буфер шаблонов.

  • Управление передается команде, за которой следует n, которая печатает содержимое буфера шаблонов.

  • Процесс повторяется до тех пор, пока файл не будет исчерпан.

Первоначально SED считывает первую строку, т. Е. A Storm of Swords, в буфер шаблонов.

Команда x перемещает эту строку в буфер удержания.

n извлекает следующую строку, т. е. Джордж Р. Р. Мартин, в буфер шаблонов.

Управление передается команде, за которой следует n, которая печатает содержимое буфера шаблонов.

Процесс повторяется до тех пор, пока файл не будет исчерпан.

Теперь давайте обменяем содержимое буферов перед печатью. Угадай, что происходит? Да, он печатает названия книг.

[jerry]$ sed -n 'x;n;x;p' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 Буря мечей 
 Две башни 
 Алхимик 
 Братство кольца 
 Паломничество 
 Игра престолов

Команда h имеет дело с буфером удержания. Он копирует данные из буфера шаблонов в буфер хранения. Существующие данные из буфера хранения перезаписываются. Обратите внимание, что команда h не перемещает данные, она только копирует данные. Следовательно, скопированные данные остаются в том же виде, что и в буфере шаблонов. Ниже приведен синтаксис команды h .

 [ADDRESS1 [, адрес2]] ч 

Следующая команда печатает только названия автора Пауло Коэльо.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 Алхимик 
 Паломничество

Давайте разберемся, как работает вышеуказанная команда. Содержимое books.txt соответствует определенному формату. Первая строка – название книги, за которой следует автор книги. В приведенной выше команде “!” используется для отмены условия, т. е. строка копируется в буфер удержания только тогда, когда совпадение с образцом не удается. И фигурные скобки {} используются для группировки нескольких команд SED

На первом проходе команды SED считывает первую строку, т. Е. A Storm of Swords, в буфер шаблонов и проверяет, содержит ли он шаблон Paulo или нет. Поскольку сопоставление с образцом не удается, оно копирует эту строку в буфер хранения. Теперь и шаблонный буфер, и буфер хранения содержат одну и ту же строку, т. Е. A Storm of Swords. На втором этапе он проверяет, содержит ли строка паттерн Пауло или нет. Поскольку шаблон не совпадает, он ничего не делает.

Во втором проходе он читает следующую строку George RR Martin в буфер шаблонов и применяет те же шаги. Для следующих трех строк он делает то же самое. В конце пятого прохода оба буфера содержат Алхимик. В начале шестого прохода он читает строку Paulo Coelho и, когда шаблон соответствует, не копирует эту строку в буфер удержания. Следовательно, буфер шаблонов содержит Пауло Коэльо, а буфер хранения содержит Алхимик.

После этого он проверяет, содержит ли буфер шаблонов шаблон Paulo. Когда совпадение с шаблоном завершается успешно, оно обменивается содержимым буфера шаблона с буфером удержания. Теперь буфер шаблонов содержит The Alchemist, а буфер хранения содержит Paulo Coelho. Наконец, он печатает содержимое буфера шаблонов. Те же шаги применяются к шаблону «Паломничество».

Команда h уничтожает предыдущее содержимое буфера удержания. Это не всегда приемлемо, так как иногда нам нужно сохранять содержимое. Для этого SED предоставляет команду H, которая добавляет содержимое в буфер удержания, добавляя новую строку в конце. Единственная разница между командами h и H состоит в том, что первая перезаписывает данные из буфера хранения, а последняя добавляет данные в буфер удержания. Его синтаксис похож на команду h .

 [Адрес1 [, адрес2]] Н

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

[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 Алхимик 
 Пауло Коэльо 
 Паломничество
 Пауло Коэльо

Мы узнали, как копировать / добавлять содержимое буфера шаблонов для хранения буфера. Можем ли мы выполнить обратную функцию? Да, конечно! Для этой цели SED предоставляет команду g, которая копирует данные из буфера хранения в буфер шаблонов. При копировании существующие данные из пространства шаблонов перезаписываются. Ниже приведен синтаксис команды g .

 [адрес1 [, адрес2]] г

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

[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 Пауло Коэльо 
 Алхимик 
 Пауло Коэльо 
 Паломничество

Первая команда сохраняется как есть. В конце пятого прохода оба буфера содержат Алхимик. В начале шестого прохода он читает строку Paulo Coelho и, когда шаблон соответствует, не копирует эту строку в буфер удержания. Следовательно, пространство образца содержит Пауло Коэльо, а пространство удержания содержит Алхимика.

После этого он проверяет, содержит ли пространство шаблонов шаблон Пауло. Когда совпадение с шаблоном завершается успешно, оно сначала печатает содержимое пространства шаблонов, т. Е. Пауло Коэльо, затем копирует буфер удержания в буфер шаблонов. Следовательно, и паттерны паттернов и держатели содержат The Alchemist. Наконец, он печатает содержимое буфера шаблонов. Те же шаги применяются к шаблону «Паломничество».

Точно так же мы можем добавить содержимое буфера хранения в буфер паттернов. SED предоставляет команду G, которая добавляет содержимое в буфер шаблонов, добавляя новую строку в конце.

 [адрес1 [, адрес2]] G

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

[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 Пауло Коэльо 
 Алхимик 
 Пауло Коэльо 
 Паломничество

Можете ли вы изменить приведенный выше пример для отображения названий книг, за которыми следуют их авторы? Просто, просто поменяйте содержимое буфера перед командой G.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt

Выполнив приведенный выше код, вы получите следующий результат: