sed 在匹配模式时忽略空格

假设您有一组单词或者行,它们想要匹配它们并执行某些活动,但您不知道每个单词或者字符串之间的空格数。
该怎么办?

例如,我有一个包含以下内容的文件 /tmp/file

Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing cgroup subsys cpuset
Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing cgroup subsys cpu
Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing cgroup subsys cpuacct

我想对“初始化cgroup subsys cpuset”进行grep
但我不想因为每个单词之间的空格而冒险

如果我做一个正常的搜索和替换,如下所示:

# sed 's/Initializing cgroup subsys cpuset/NEW CONTENT/g' /tmp/file
Dec 14 13:29:13 cc01-pgd-002a kernel: NEW CONTENT
Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing cgroup subsys cpu
Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing cgroup subsys cpuacct

但如果有多个空格,匹配模式就无效了:

# cat /tmp/file
Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing   cgroup subsys   cpuset
Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing cgroup subsys cpu
Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing cgroup subsys cpuacct

所以我们必须尽量忽略这些空格,以便我们有一个完美的匹配:

# sed 's/Initializings*cgroups*subsyss*cpuset/NEW CONTENT/g' /tmp/file
Dec 14 13:29:13 cc01-pgd-002a kernel: NEW CONTENT
Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing cgroup subsys cpu
Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing cgroup subsys cpuacct

其中
s 表示空白字符 这相当于[[:blank:]
* 表示0或者更多

所以我们还可以这样匹配:

# sed 's/Initializing[[:blank:]]*cgroup[[:blank:]]*subsys[[:blank:]]*cpuset/NEW CONTENT/g' /tmp/file
Dec 14 13:29:13 cc01-pgd-002a kernel: NEW CONTENT
Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing cgroup subsys cpu
Dec 14 13:29:13 cc01-pgd-002a kernel: Initializing cgroup subsys cpuacct
日期:2020-06-02 22:17:33 来源:oir作者:oir