我正在尝试在配置文件(/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
但是,这不会更改文件。根据正则表达式,正则表达式匹配,但检查sed.js.org, sed 不会改变任何事情。
如何修复我的sed
命令,以更改休眠配置块的相应行?
编辑:看来我无法让sed
带有换行符的组根本不工作。
答案1
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
请注意,与您的原始版本一样,只有在可以依赖块中的行顺序的情况下,这才有效。