Замените один регекс, затем замените второй регекс во всех строках, не соответствующих первой

Обычно инструменты разметки требуют, чтобы разделы не монтировались. Вы должны использовать 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)
6
24.06.2018, 17:50
4 ответа

Вы можете использовать команду 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.

14
27.01.2020, 20:20

Попробуйте это:

sed -e '/foo/!s/$/baz/g' -e s/foo/bar/g
2
27.01.2020, 20:20

Разобрался:

sed -e '/foo/{s//bar/;p;D};s/$/baz/' 

Пояснение:

  • Несколько команд sed можно объединить в цепочку с ;и сгруппировать с помощью {... }.
  • /foo/выбирает все строки, содержащие паттерн foo.
  • s//bar/совпадает сs/foo/bar/-пустой шаблон означает повторение последнего поиска (в данном случаеfoo).
  • pозначает печать пространства шаблона (строки после подстановки ).
  • Dозначает очистить текущую строку и перейти к следующей.
  • s/$/baz/выполнит вторую часть задачи, т.е. добавит bazк строкам, которые оставило пройти предыдущее правило.
1
27.01.2020, 20:20

Более надежный способ сawkскриптом:

awk '{ if (/foo/) gsub(/foo/, "bar"); else $0 = $0 "baz" }1' file

Или даже короче:

awk '{ if (!gsub(/foo/, "bar")) $0 = $0 "baz"; }1' file
3
27.01.2020, 20:20

Теги

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