Поиск и замена повторяющихся символов в строке

Итак, как решение;

Предыстория :Я использую Arch Linux. Он использует mkinitcpio для генерации своих initramfs (и раннего пользовательского пространства (! )). Поскольку мы загружаем образ файловой системы из NTFS, нам нужно настроить initramfs. Мы можем использовать GRUB и его модуль ntfs для чтения (NTFS-модуль GRUB является ro afaik. )ядро ​​и initramfs из раздела NTFS. После этого нам все еще нужно смонтировать раздел NTFS из initramfs для полного доступа для чтения/записи.

Теория работы решения :Я добавил пакеты ntfs -3g и fusefs в initramfs, чтобы можно было смонтировать раздел NTFS. Я также создал новый хук mkinitcpio , который нужно загрузить перед фактическим монтажным хуком. Хук представляет собой простой сценарий оболочки, который получает параметры (, которые задаются как аргументы ядра из GRUB ), например

.

menuentry "Boot LINUX FROM ISO FILE" {
  insmod ntfs
  set root='(hdX,Y)'
  linux /in_ntfs/vmlinuz-linux root=UUID=*GPT_UUID_OF_ROOTFS_ON_DISK_IMAGE* image_path=*path_to_disk_image_on_NTFS* image_hd=*GPT_UUID_OF_NTFS_DISK*
  initrd /in_ntfs/initrd.img
}
  1. Местоположение образа диска внутри раздела NTFS (образ _путь)
  2. Раздел NTFS GPT GUID (образ _hd)
  3. Если образ диска содержит несколько разделов, UUID rootfs (root)

Процедура загрузки при монтировании дисков:

  1. Перехватчик initcpio монтирует раздел NTFS
  2. Перехватчик initcpio монтирует образ диска из раздела NTFS как петлевое устройство
  3. Теперь запускается обычный хук монтирования, ему дается ext4 или любой другой раздел, содержащий linux rootfs внутри этого образа диска, смонтированного на шаге 2
  4. Система выходит из раннего пользовательского пространства; newroot устанавливается на NTFS -loop -смонтированный раздел rootfs файла образа.
  5. Та -да, мы получили работающую систему Linux с разрешениями на чтение и запись, работающую с образа диска/iso-образа внутри раздела NTFS.

1
08.10.2020, 04:08
2 ответа

для этого можно использовать sed

echo staaacksoveerfloow | sed 's/\([a-zA-Z]\)\1\+/\1/g'

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

1
18.03.2021, 22:59

Вksh93:

$ var=staaacksoveerfloow
$ print -r -- "${var//@(?)+(\1)/\1}"
stacksoverflow

(замените ?на [[:alpha:]]/ [[:lower:]]... если вы хотите ограничить дедупликацию только некоторым классом символов ).

Вzsh:

$ autoload -Uz regexp-replace
$ set -o rematchpcre
$ var=staaacksoveerfloow
$ regexp-replace var '(.)\1+' '$match[1]'
$ print -r -- $var
stacksoverflow

Снова замените .на [[:alpha:]]/[[:lower:]](классы символов POSIX )или свойства PCRE (, такие как \p{Latin}, чтобы ограничить буквы в латинском сценарии (, используемом в Английский ), например ), или \w... Подробнее см. man pcrepattern.

0
18.03.2021, 22:59

Теги

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