Расширенные возможности «Сед»: мой маленький мозг вот-вот закружится

Linux Shell
Расширенные возможности «Сед»: мой маленький мозг вот-вот закружится

Самая полезная серия:

«Наиболее часто используемый набор навыков «vim» в производственной среде Linux.

«Наиболее часто используемый набор навыков «Sed» в производственной среде Linux.

«Наиболее часто используемый набор навыков «AWK» в производственной среде Linux.

«Расширенные возможности «Сед»: мой маленький мозг вот-вот упадет в обморок»

Команда sed имеет два пробела, один из которых называется пространством шаблонов, а другой называется пространством удержания. Эти два места могут доказать, что возможности человеческого мозга очень малы, и требуется много тренировок и понимания, чтобы приспособиться к некоторым очень простым операциям.

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

sed 'N; $!P;$!D;$d' file

существует«Наиболее часто используемый набор навыков «Sed» в производственной среде Linux.В этой статье мы представили часто используемые команды и операции sed, а также использовали два изображения в качестве подсказки. Но, к сожалению, эти две диаграммы совершенно неточны (например, команда s, которая является лишь их подмножеством), даже если они могут помочь новичкам быстро начать работу.

Эта статья относится к промежуточному использованию sed, которое распространено в некоторых сценариях sed и не очень широко используется в повседневной жизни, но часто может привести к неожиданным результатам.

принцип

Рабочий режим

Это начинается с рабочего режима sed.

В зависимости от того, как мы читаем файл, он обычно читается непрерывно и циклически. Например, в следующем коде Python print представляет команду p.

with open('file', 'r') as f:
    for line in f.readlines():
        print(line)

Кроме того, команда sed буферизует еще одну вещь. Это «содержимое предыдущей строки», называемое пробелом. Текущая строка называется пространством шаблонов. Простое выражение в питоне:

hold_space = ""
with open('file', 'r') as f:
    for pattern_space in f.readlines():
        print(hold_space,pattern_space)
        hold_space = pattern_space

Конкретный процесс в целом похож на приведенный выше код, взяв в качестве примера приведенный выше рисунок. В этом примере пространство удержания не участвует в операции и совершенно нечувствительно:

1,прочитать текущую строкуwtf..в пространство шаблона

2,Выполнение заказаp, который печатает текущую строку

3.Назначьте содержимое пространства Pattern пространству Hold

4.Перейти к следующей строке обработки, зациклить этот процесс

Пример: х

Но я хочу немного манипулировать двумя буферами. Это операция swap, которая обозначается x, что также совместимо с некоторыми текстовыми редакторами.

То есть перед p мы добавляем x. Указывает, что два буфера сначала замещаются, а затем выходят из строя.

hold_space = ""
with open('file', 'r') as f:
    for pattern_space in f.readlines():
        swap(hold_space,pattern_space)
        print(hold_space,pattern_space)
        hold_space = pattern_space

Позвольте мне представить этот процесс.

1,В начале содержимое Hold_space пусто. Однако до того, как она будет заполнена, она используется и заменяется текущей строкой.

2,Команда p используется для замененного буфера, и в первый раз печатается пустая строка, бля

3.Продолжайте пищать, теперь это последняя строка, и замена выполняется сразу, и она находится в hold_space без возможности печати.

4.Текущая строка хранит данные предпоследней строки, и последняя строка никогда не появится, когда последняя строка мертва.

Конечно, у нас есть способ получить его, например, я выполняю четное количество обменов x.

sed -n 'x;x;x;x;p' file

У вас есть ощущение, что вы едете верхом на альпаке по всему миру?

применение

взять каштан

Вы можете подумать, какой смысл менять местами эти два буфера? Далее посмотрите на этот файл.

小姐姐味道公众号
CEO
加菲猫经理
IT Manager
系统毁灭师
Sysadmin
小哥哥味道
Developer
爱卖东西的经理
Sales Manager
风清扬
Dog

Нечетные строки файла — это имена, а четные строки — это позиции. мы хотим вывести всеManagerназвание. Вы можете использовать следующую команду.

sed -n -e 'x;n' -e '/Manager/{x;p}' file

Команда разделена на две части.

x;nУказывает, что строки с четными номерами сохраняются в пространстве шаблонов, а строки с нечетными номерами сохраняются в пространстве хранения.

/Manager/{x;p}Команда выполнит поиск ключевого слова Manager в пространстве шаблонов. Если условия выполняются, буферы p и h снова меняются местами и выводятся имена, соответствующие нечетным строкам.

вышеxиn, которая является командой для этих двух буферов. Таких команд много.

Заказ

Эти команды, если их больше, могут быть заключены в {}, как и команда выше. Расположение этих команд там же, где мы упоминали в предыдущей статье.

общий:

xПозвольте мне поставить букву «б» на английском языке: Поменяйте местами содержимое пробелов и шаблонов.

dОчистите текущее пространство шаблона, затем введите следующий цикл

DУдалить первую строку пространства шаблона (многострочный шаблон)

hСкопируйте пространство шаблона, чтобы сохранить пространство

HДобавить шаблон с интервалом для удержания места

gСкопируйте пространство удержания в пространство шаблона

GДобавить пространство удержания к пространству шаблона

nпрочитать следующую строку ввода в пространство шаблонов

NДобавляет следующую строку ввода к пространству шаблонов и обрабатывает две строки как одну строку, но по-прежнему содержит \n новых строк между двумя строками.

pраспечатать текущее пространство шаблона

Pнапечатать первую строку в текущем пространстве шаблонов

редко используемый

Игра Sokoban, о которой я упоминал в прошлый раз, использует много этого материала. Чтобы сделать пользователей действительно «свободными» при написании сценариев sed, sed также позволяет использовать «:» для установки токенов в сценариях. Теги имеют функцию, подобную языку программирования.

qВыйдите из sed, вы можете увеличить скорость выполнения

lСписок текущей строки, включая непечатаемые символы

l widthЧтобы просмотреть текущую строку, используйтеwidth charactersконец

b labelПерейти на соответствующую вкладку, разделить команду.

t labelВетка if, начиная с последней строки, после выполнения условия или команды T, t вызовет ветку на команду с меткой или в конец скрипта. Тестовая команда.

T labelВетвь ошибки, начиная с последней строки, при возникновении ошибки или команды T, t вызовет ветку к команде с меткой или к концу скрипта.

Конечно, есть и другие, менее часто используемые, вы можете использовать команду man для просмотра

man sed

Некоторые команды: включить режим тренировки

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

Команда, похожая на конвейер

sed -n '2{h;n;x;H;x};p' file

Поменять местами содержимое строк 2 и 3

вывести последнюю строку

sed 'N;D' file

Последние две строки в выходном файле

sed '$!N; $!D' file

удалить последние две строки в файле

sed 'N; $!P;$!D;$d' file

Другой способ печати четных строк

sed –n 'n;p' file

Добавляйте пустую строку через каждые 5 строк.

sed 'n;n;n;n;G' file

Вывод абзацев с AAA и BBB и CCC (в любом порядке)

sed -e '/./{H; $!d;}' -e 'x;/AAA/!d; /BBB/!d; /CCC/!d' file

Обратный порядок строк (сделать последнюю строку первой, а первую - последней)

sed -n '1!G; h; $p' file

Эта команда немного окольная, прежде всего,1!GОперация G выполняется на других строках, кроме первой, а затем копируется обратно в обратном порядке.Когда достигается последняя строка, пространство шаблона печатается напрямую.$Указывает, что следующая команда выполняется в последней строке или может быть${p}

Помеченное использование

sed -e :a -e '$q;N;11,$D;ba'

Распечатайте последние 10 строк.aэто ярлык. Синтаксис - это всего лишь одна строка, используйте:разделены.

End

Дабы повысить свою конкурентоспособность в компании, можно получить кучу sed-скриптов для блефа (зарывания мин). Как и в случае с некоторыми сценариями Perl, даже разработчикам с соответствующим опытом нужно много работать, чтобы понять их, не говоря уже о других.

Это sed, простая, но не простая команда.Эта статья является промежуточной записью. Промежуточный вход также немного утомляет мозг, потому что в вашем мозгу вам нужно постоянно поддерживать эти два буфера. Это замена и опустошение, что эквивалентно машине состояний человека. Конечно, то, как сделать этот процесс максимально простым, все равно тратит много мозговых клеток автора. Даже если вы поставите лайк, это способ отсрочить время, когда юная леди заболеет болезнью Альцгеймера. С вашей поддержкой Мисс Сестра может подумать и о других вещах, помимо технологий, например о распылении летучих мышей или о чем-то подобном.