sed 模式匹配

pau*_*ler 2 sed regular-expression

我最近问工作中的某人如何获取 ipcs -qa 的输出并使其以空格分隔,以便我可以解析它/将其存储在数据库中以进行监控。他给了我这个:

ipcs -qa | sed 's/ [ ]* / /g'
Run Code Online (Sandbox Code Playgroud)

它有效,但为什么呢?他是如何构造那个模式字符串的?我在哪里可以找到有关如何构建它们的文档?我检查了手册页,但它非常不透明。

use*_*own 5

sed 's/ [ ]* / /g'
\_/  | \____/ | |
 |   |    |   | \- g=globally (not just one occurence)
 |   |    |   |
 |   |    |   \- to
 |   |    |
 |   |    \- from
 |   |
 |   \- s=substitute
 |
 \- program sed
Run Code Online (Sandbox Code Playgroud)

来自部分:

/ [ ]* /
| \_/| 
|  | \- repeated 0-infinite times
|  |
|   \- group of characters
|
\- boundary
Run Code Online (Sandbox Code Playgroud)

包括*在内,有3个量词:

  • 0 到无穷大?0 或 1 次
  • 1 到无穷大

它们通常只引用最后一个字符,所以 x* 匹配 x、xxxx 而什么都不匹配。X?匹配 0 或 1 x,+ 匹配 x、xx、xxx 等。但它可以匹配一组字符,如 [aeiou]+ 或组合,封装在括号中:(foo)*。第一个匹配 iiaiaei,第二个 foo 和 foofoo。

组可以是枚举 [aeiou] 或从组:[az] 或组合:[0-9a-fA-F:]。如果您想在组中包含减号,则必须将其放在末尾或开头:[-,:]。

最常用的命令可能是 's' 代替。其他的 'd' 表示删除,'p' 表示打印。

模式被封装在分隔符之间,通常是斜杠。

 sed 's/foo/bar/' 
Run Code Online (Sandbox Code Playgroud)

Sed 面向行工作。如果你想用 bar 替换一个(第一个)foo,上面的命令是可以的。要替换所有内容,您需要全局使用 'g'。

 sed 's/foo/bar/g' 
Run Code Online (Sandbox Code Playgroud)

使用 sed 调用行号的其他方法:

 sed -n '1,5p' file 
Run Code Online (Sandbox Code Playgroud)

-n 默认不打印,1,5p 表示:从第 1 行到第 5 行打印。

 sed '6,$d' file 
Run Code Online (Sandbox Code Playgroud)

这是等价的。它将从第 6 行删除到结尾。

 sed '5q' file
Run Code Online (Sandbox Code Playgroud)

还是一样:第 5 行后退出。

通常对于 sed 来说,该命令更容易写入而不是读取。