我最近向工作中的某人询问如何获取 ipcs -qa 的输出并使其以空格分隔,以便我可以解析它/将其存储在数据库中以进行监控。他给了我这个:
ipcs -qa | sed 's/ [ ]* / /g'
它有效,但为什么呢?他是如何构建该模式字符串的?在哪里可以找到有关如何构建它们的文档?我检查了手册页,但它非常不透明。
答案1
sed 's/ [ ]* / /g'
\_/ | \____/ | |
| | | | \- g=globally (not just one occurrence)
| | | |
| | | \- to
| | |
| | \- from
| |
| \- s=substitute
|
\- program sed
来自部分:
/ [ ]* /
| \_/|
| | \- repeated 0-infinite times
| |
| \- group of characters
|
\- boundary
包括*在内,共有3个量词:
- 0 到无穷大? 0或1次
- 1 到无穷大
它们通常只引用最后一个字符,因此 x* 匹配 x、xxxx,什么也不匹配。 X?匹配 0 或 1 x,x+ 匹配 x、xx、xxx 等。但它可以匹配一组字符,如 [aeiou]+ 或组合,封装在括号中:(foo)*。第一个匹配 iiaiaei,第二个匹配 foo 和 foofoo。
组可以是枚举 [aeiou] 或 from-to 组:[az] 或组合:[0-9a-fA-F:]。如果您想在组中包含减号,则必须将其放在末尾或开头:[-,:]。
最常用的命令可能是“s”来代替。其他的“d”表示删除,“p”表示打印。
模式封装在分隔符(通常是斜杠)之间。
sed 's/foo/bar/'
sed 面向行工作。如果你想用 bar 替换一个(第一个) foo ,上面的命令就可以了。要替换全部,您需要“g”来表示全局。
sed 's/foo/bar/g'
使用 sed 调用行号的其他方法:
sed -n '1,5p' file
-n 默认不打印,1,5p表示:从第1行打印到第5行。
sed '6,$d' file
这是等价的。它将删除从第 6 行到末尾的内容。
sed '5q' file
又是一样的:在第 5 行之后退出。
对于 sed 来说,典型的情况是命令更容易编写而不是读取。
答案2
首先,这些似乎都工作得很好:
sed 's/[ ]* / /g'
sed 's/ [ ]*/ /g'
sed 's/ * / /g'
sed 's/ * / /g'
sed 's/ */ /g'
sed 's/ \+/ /g'
sed 's/ \+ / /g'
基本上它所做的就是匹配 2 个空格,加上任意数量的连续空格。这是有效的,因为正则表达式默认是贪婪的,所以“任何数字”都是它能找到的尽可能多的数字。 (并且[ ]
是“匹配其中任何一个”,仅列出一个空格字符)
问题中使用的特定语法是理想的,因为您正在处理空格:
sed 's/ [ ]* / /g'
没有两个空格字符是相邻的,所以一眼就能看出有3个空格,少了很可能被解释为拼写错误。