In my last articles I had shared the arguments with sed which can be used to perform case insensitive actions (search, replace..) in a file and to delete all blank lines from the file.
Now suppose you have a set of words or line which want to match and perform some activity but you do not know the no of whitespace between each word or string.
For eg I have a file /tmp/file with below content
I would like to grep for "Initializing cgroup subsys cpuset"
but I do not want to risk the grep with the spaces between every word
If I do a normal search and replace like below
It worked as expected but what if there were some extra spaces between the words like below
and trying the same command as above
It didn't worked.
So we have to try to ignore these whitespaces so that we have a perfect match
It worked so below is what you have to use
So search for all whitespace (0 or higher) when used
Now suppose you have a set of words or line which want to match and perform some activity but you do not know the no of whitespace between each word or string.
For eg I have a file /tmp/file with below content
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
I would like to grep for "Initializing cgroup subsys cpuset"
but I do not want to risk the grep with the spaces between every word
If I do a normal search and replace like below
# 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
It worked as expected but what if there were some extra spaces between the words like below
# 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
and trying the same command as above
# sed 's/Initializing cgroup subsys cpuset/NEW CONTENT/g' /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
It didn't worked.
So we have to try to ignore these whitespaces so that we have a perfect match
# sed 's/Initializing\s*cgroup\s*subsys\s*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
It worked so below is what you have to use
\s This is equivalent to [[:blank:]]
* means 0 or higher
So search for all whitespace (0 or higher) when used
# 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
sed: Ignore whitespace while matching a pattern
Reviewed by admin
on
Sunday, December 17, 2017
Rating:
No comments: