Обычно инструменты разметки требуют, чтобы разделы не монтировались. Вы должны использовать parted
или gparted
непосредственно в файле изображения, используя:
parted /path/to/disk.img
Пример вывода:
$ parted VirtualBox\ VMs/centos/VMDK-test-flat.vmdk
WARNING: You are not superuser. Watch out for permissions.
GNU Parted 2.3
Using /home/testuser/VirtualBox VMs/centos/VMDK-test-flat.vmdk
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: (file)
Disk /home/testuser/VirtualBox VMs/centos/VMDK-test-flat.vmdk: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 32,3kB 535MB 535MB primary ext4
2 535MB 1069MB 535MB primary ext4
(parted)
Вы можете использовать команду t
без метки, чтобы начать следующий цикл при успешной замене
$ cat ip.txt
a foo 123
xyz
fore
1foo
$ sed -e 's/foo/bar/' -e t -e 's/$/baz/' ip.txt
a bar 123
xyzbaz
forebaz
1bar
Из руководства:
t label (test)
Branch to label only if there has been a successful substitution since the last input line was read or conditional branch was taken. The label may be omitted, in which case the next cycle is started.
Разобрался:
sed -e '/foo/{s//bar/;p;D};s/$/baz/'
Пояснение:
;
и сгруппировать с помощью {
... }
. /foo/
выбирает все строки, содержащие паттерн foo
. s//bar/
совпадает сs/foo/bar/
-пустой шаблон означает повторение последнего поиска (в данном случаеfoo
). p
означает печать пространства шаблона (строки после подстановки ). D
означает очистить текущую строку и перейти к следующей. s/$/baz/
выполнит вторую часть задачи, т.е. добавит baz
к строкам, которые оставило пройти предыдущее правило. Более надежный способ сawk
скриптом:
awk '{ if (/foo/) gsub(/foo/, "bar"); else $0 = $0 "baz" }1' file
Или даже короче:
awk '{ if (!gsub(/foo/, "bar")) $0 = $0 "baz"; }1' file