Sed

無法使用組和多行使用 sed 更改配置文件

  • January 27, 2020

我正在嘗試在配置文件 ( /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla) 中編寫腳本更改,歸結為:

[Update already installed software]
Identity=unix-group:admin;unix-group:sudo
Action=org.debian.apt.upgrade-packages
ResultActive=yes

[Printer administration]
Identity=unix-group:lpadmin;unix-group:admin;unix-group:sudo
Action=org.opensuse.cupspkhelper.mechanism.*
ResultActive=yes

[Disable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=no

我正在嘗試ResultActive=yes為所有以[Disable hibernate. 使用 sed 和正則表達式組我想出了:

sed -i 's/\(Disable hibernate.*\n.*\n.*\nResultActive\=\)no/\1yes/' /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla

但是,這不會更改文件。根據regexr,正則表達式匹配,但檢查sed.js.org, sed 不會改變任何事情。

如何修復我的sed命令,以更改休眠配置塊的相應行?

**編輯:**似乎我無法讓sed帶有換行符的組根本不起作用。

Sed 預設是基於行的 - 要進行多行匹配,您需要顯式地將行添加到模式空間(N例如使用命令)。

相反,你可以做這樣的事情,它仍然是基於行的,但向前載入感興趣的行:

$ sed '/^\[Disable hibernate/{n;n;n;/^ResultActive/s/=no/=yes/;}' file.pkla
[Update already installed software]
Identity=unix-group:admin;unix-group:sudo
Action=org.debian.apt.upgrade-packages
ResultActive=yes

[Printer administration]
Identity=unix-group:lpadmin;unix-group:admin;unix-group:sudo
Action=org.opensuse.cupspkhelper.mechanism.*
ResultActive=yes

[Disable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

請注意,就像您的原件一樣,這僅在可以依賴塊中的行順序時才有效。

引用自:https://unix.stackexchange.com/questions/564316