我正在尝试使用两个命令进行 sed 替换。我不知道如何将这两个命令组合在一起,以便一次正确地替换单词。
我在这里的角色是附加sc_admin
到每个有单词admin
的地方。
以下是我能想到的所有单词组合:
access = read : [ admin ], write : [ admin, power ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web ]
access = read : [ admin ]
access = read : [ admin, somerole ], write : [ admin, power ]
所以目前我正在使用 2 个 sed 命令进行替换
sed -e '/\bsc_admin\b/b' -e '/admin/ s/ *]/, sc_admin ]/' infile
正确替换读取部分中的单词 admin 但不替换写入部分中的单词 admin。
例如
access = read : [ admin, sc_admin ], write : [ admin, power ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ *, sc_admin ], write : [ admin, wis_master, wis_read_only, wis_web ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole, sc_admin ], write : [ admin, power ]
access = read : [ defadmin, somerole, sc_admin ], write : [ admin, power ]
尽管
sed -e '/\bsc_admin\b/b' -e '/admin/ s/ *] *$/, sc_admin ]/'
命令正确地在写入部分附加单词 admin,而它对读取部分不做任何事情。
access = read : [ admin ], write : [ admin, power, sc_admin ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web, sc_admin ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole ], write : [ admin, power, sc_admin ]
access = read : [ defadmin, somerole ], write : [ admin, power ]
所以目前我正在运行一个命令,然后我正在运行第二个命令来修复文件。有没有一种万无一失的方法来组合命令以便获得正确的输出?
这是我想要的实际输出:
access = read : [ admin, sc_admin ], write : [ admin, power, sc_admin ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web, sc_admin ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole, sc_admin ], write : [ admin, power, sc_admin ]
您可以执行以下操作
sed
:\(\[ admin[^]]*\)
捕获字符串 '[ admin<每个不是 ] 和最后一个空格的字符>。为此,我们将捕获包含在 之间\(...\)
,并用于[^]]*
选择不是 (^
) ']' 的字符。\1, sc_admin
替换为捕获的组 (\1
) 并附加 ', sc_admin'。