Сопоставление нескольких диапазонов с выражениями диапазона sed

1.)/sysне является реальной файловой системой -диска :это представление и средство доступа к внутреннему состоянию ядра в виде виртуальной файловой системы. Он полностью основан на оперативной памяти -, и нет смысла хранить содержимое /sysна диске.

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

Пока вы находитесь в процессе установки Gentoo, новая установка еще не имеет своего собственного работающего ядра, поэтому новая установка не может иметь своего отдельного ядра /sys. Но среда установщика имеет свою собственную /sys, и выполнение монтирования привязки заставляет «систему в стадии разработки» заимствовать дерево файловой системы /sysсреды установки. Это делает некоторые задачи при установке точно такими же, как и при обновлении существующей системы, и поэтому одни и те же сценарии могут использоваться для обоих случаев :при обновлении, они используются так же, как -, но во время установки они просто нужно запустить chroot в /mnt/gentoo.

2. )В соответствии с /sysможет быть или не быть debugfsсмонтированным как /sys/kernel/debug, efivarfsхранилище переменных UEFI псевдо -файловая система как /sys/firmware/efi/efivars,и, возможно, несколько файловых систем на базе RAM -для управления различными контрольными группами в /sys/fs/cgroup/*.

Под /devмогут быть по крайней мере /dev/pts, /dev/shm, /dev/hugepagesи/или /dev/mqueue, все различные специальные -целевые ОЗУ -на основе файловых систем.

Таким образом, использование rbind явно упростит ситуацию.

0
04.11.2021, 18:50
3 ответа

Похоже, вы неправильно поняли, что 4,6делает в sed. Единственный способ, которым старый вопрос и новый не отличаются полностью, - это если вы хотите извлечь строки на основе содержимого (, ограниченного начальным и конечным шаблоном ), а не номерами строк. Использование seqделает формулировку очень двусмысленной.

Если вы действительно хотели извлечь строки на основе номера строки, ответы Nate T и они являются единственными, которые действительно обобщают. Однако, если вы хотите фильтровать на основе содержимого строки (, как предлагает ваш обновленный вопрос ), вы ищете диапазоны шаблонов. В частности, если вы хотите извлечь то, что находится между строками, которые заканчиваются на 4, и следующей строкой, которая заканчивается на 6, вы ищете:

seq 35 | sed -n "/4$/,/6$/p"

Начальный шаблон (, т. е. 4$), и конечный шаблон (, т. е. 6$), могут быть сделаны произвольно сложными в соответствии с вашими потребностями (, такими как helloи world).

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

sed -n "/4$/,/6$/p" <<EOF 
heredoc> 1
heredoc> 2
heredoc> 3
heredoc> 4
heredoc> 14
heredoc> 15
heredoc> 5
heredoc> 6
heredoc> 7
heredoc> 14
heredoc> 14
heredoc> 14
heredoc> 16
heredoc> 16
heredoc> 15
heredoc> EOF
4
14
15
5
6
14
14
14
16

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

1
06.11.2021, 08:33
seq 20 | sed -e '/[0-37-9]$/d'

Вам нужно удалить ненужные строки.

1
05.11.2021, 00:34

Решение, которое я придумал, очень похоже на решение, опубликованное @they, но на самом деле использует другую технику. Я использовал формат двойного адреса. Вместо того, чтобы использовать первый адрес для вывода 4, 5, & 6, я использовал его для сопоставления с 4, 14, etc., а затем использовал синтаксис +Nдля второго, чтобы напечатать соответствующие *5и *6для каждого экземпляра.

Получившаяся команда была

seq 20 | sed -n 4~10,+2p
2
05.11.2021, 02:01

Теги

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