无法使用组和多行使用 sed 更改配置文件

无法使用组和多行使用 sed 更改配置文件

我正在尝试在配置文件(/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

请注意,与您的原始版本一样,只有在可以依赖块中的行顺序的情况下,这才有效。

相关内容